--dbuser "$dbuser"
--dbpass ""
--scriptpath "/w"
+ - echo -en "\n\nrequire_once __DIR__ . '/includes/DevelopmentSettings.php';\n" >> ./LocalSettings.php
+ - php -l ./LocalSettings.php
script:
- php tests/phpunit/phpunit.php
chromium: {
browsers: [ 'Chromium' ]
},
- more: {
- browsers: [ 'Chrome', 'Firefox' ]
+ firefox: {
+ browsers: [ 'Firefox' ]
}
},
copy: {
default mode.
* CACHE_ACCEL now only supports APC(u) or WinCache. XCache support was removed
as upstream is inactive and has no plans to move to PHP 7.
+* The old CategorizedRecentChanges feature, including its related configuration
+ option $wgAllowCategorizedRecentChanges, has been removed.
=== New features in 1.31 ===
* Wikimedia\Rdbms\IDatabase->select() and similar methods now support
* Updated wikimedia/running-stat from 1.1.0 to 1.2.0.
* Updated wikimedia/wrappedstring from 2.2.0 to 2.3.0.
* Updated mediawiki/at-ease from 1.1.0 to 1.2.0.
+* Updated wikimedia/php-session-serializer from 1.0.4 to 1.0.5.
* …
==== New external libraries ====
'UserBlockedError' => __DIR__ . '/includes/exception/UserBlockedError.php',
'UserCache' => __DIR__ . '/includes/cache/UserCache.php',
'UserDupes' => __DIR__ . '/maintenance/userDupes.inc',
+ 'UserGroupExpiryJob' => __DIR__ . '/includes/jobqueue/jobs/UserGroupExpiryJob.php',
'UserGroupMembership' => __DIR__ . '/includes/user/UserGroupMembership.php',
'UserMailer' => __DIR__ . '/includes/mail/UserMailer.php',
'UserNamePrefixSearch' => __DIR__ . '/includes/user/UserNamePrefixSearch.php',
"wikimedia/html-formatter": "1.0.1",
"wikimedia/ip-set": "1.2.0",
"wikimedia/object-factory": "1.0.0",
- "wikimedia/php-session-serializer": "1.0.4",
+ "wikimedia/php-session-serializer": "1.0.5",
"wikimedia/purtle": "1.0.6",
"wikimedia/relpath": "2.1.1",
"wikimedia/remex-html": "1.0.2",
* $a = $cf->run();
* print implode( ',' , $a );
* @endcode
+ *
+ * @deprecated since 1.31
*/
class CategoryFinder {
/** @var int[] The original article IDs passed to the seed function */
*/
$wgDisableAnonTalk = false;
-/**
- * Enable filtering of categories in Recentchanges
- */
-$wgAllowCategorizedRecentChanges = false;
-
/**
* Allow filtering by change tag in recentchanges, history, etc
* Has no effect if no tags are defined in valid_tag.
'clearUserWatchlist' => ClearUserWatchlistJob::class,
'cdnPurge' => CdnPurgeJob::class,
'enqueue' => EnqueueJob::class, // local queue for multi-DC setups
+ 'userGroupExpiry' => UserGroupExpiryJob::class,
'null' => NullJob::class,
];
--- /dev/null
+<?php
+/**
+ * Extra settings useful for MediaWiki development.
+ *
+ * To enable built-in debug and development settings, add the
+ * following to your LocalSettings.php file.
+ *
+ * require "$IP/includes/DevelopmentSettings.php";
+ *
+ * Alternatively, if running phpunit.php (or another Maintenance script),
+ * you can use the --mwdebug option to automatically load these settings.
+ *
+ * @file
+ */
+
+/**
+ * Debugging: PHP
+ */
+
+// Enable showing of errors
+error_reporting( -1 );
+ini_set( 'display_errors', 1 );
+
+/**
+ * Debugging: MediaWiki
+ */
+global $wgDevelopmentWarnings, $wgShowDBErrorBacktrace, $wgShowExceptionDetails,
+ $wgShowSQLErrors, $wgDebugRawPage,
+ $wgDebugComments, $wgDebugDumpSql, $wgDebugTimestamps,
+ $wgCommandLineMode, $wgDebugLogFile, $wgDBerrorLog, $wgDebugLogGroups;
+
+// Use of wfWarn() should cause tests to fail
+$wgDevelopmentWarnings = true;
+
+// Enable showing of errors
+$wgShowDBErrorBacktrace = true;
+$wgShowExceptionDetails = true;
+$wgShowSQLErrors = true;
+$wgDebugRawPage = true; // T49960
+
+// Enable verbose logging
+$wgDebugComments = true;
+$wgDebugDumpSql = true;
+$wgDebugTimestamps = true;
+
+// Enable log files
+$logDir = getenv( 'MW_LOG_DIR' );
+if ( $logDir ) {
+ if ( $wgCommandLineMode ) {
+ $wgDebugLogFile = "$logDir/mw-debug-cli.log";
+ } else {
+ $wgDebugLogFile = "$logDir/mw-debug-www.log";
+ }
+ $wgDBerrorLog = "$logDir/mw-dberror.log";
+ $wgDebugLogGroups['ratelimit'] = "$logDir/mw-ratelimit.log";
+ $wgDebugLogGroups['exception'] = "$logDir/mw-exception.log";
+ $wgDebugLogGroups['error'] = "$logDir/mw-error.log";
+}
+unset( $logDir );
wfDebug( __METHOD__ . ": reading site_stats from replica DB\n" );
$row = self::doLoadFromDB( $dbr );
- if ( !self::isSane( $row ) && $lb->hasOrMadeRecentMasterChanges() ) {
+ if ( !self::isRowSane( $row ) && $lb->hasOrMadeRecentMasterChanges() ) {
// Might have just been initialized during this request? Underflow?
wfDebug( __METHOD__ . ": site_stats damaged or missing on replica DB\n" );
$row = self::doLoadFromDB( $lb->getConnection( DB_MASTER ) );
}
- if ( !self::isSane( $row ) ) {
+ if ( !self::isRowSane( $row ) ) {
if ( $config->get( 'MiserMode' ) ) {
// Start off with all zeroes, assuming that this is a new wiki or any
// repopulations where done manually via script.
$row = self::doLoadFromDB( $lb->getConnection( DB_MASTER ) );
}
- if ( !self::isSane( $row ) ) {
+ if ( !self::isRowSane( $row ) ) {
wfDebug( __METHOD__ . ": site_stats persistently nonsensical o_O\n" );
// Always return a row-like object
- $row = (object)array_fill_keys( self::selectFields(), 0 );
+ $row = self::salvageInsaneRow( $row );
}
return $row;
}
- /**
- * @param IDatabase $db
- * @return stdClass|bool
- */
- private static function doLoadFromDB( IDatabase $db ) {
- return $db->selectRow(
- 'site_stats',
- self::selectFields(),
- [ 'ss_row_id' => 1 ],
- __METHOD__
- );
- }
-
/**
* @return int
*/
public static function edits() {
self::load();
- return self::$row->ss_total_edits;
+ return (int)self::$row->ss_total_edits;
}
/**
public static function articles() {
self::load();
- return self::$row->ss_good_articles;
+ return (int)self::$row->ss_good_articles;
}
/**
public static function pages() {
self::load();
- return self::$row->ss_total_pages;
+ return (int)self::$row->ss_total_pages;
}
/**
public static function users() {
self::load();
- return self::$row->ss_users;
+ return (int)self::$row->ss_users;
}
/**
public static function activeUsers() {
self::load();
- return self::$row->ss_active_users;
+ return (int)self::$row->ss_active_users;
}
/**
public static function images() {
self::load();
- return self::$row->ss_images;
+ return (int)self::$row->ss_images;
}
/**
];
}
+ /**
+ * @param IDatabase $db
+ * @return stdClass|bool
+ */
+ private static function doLoadFromDB( IDatabase $db ) {
+ return $db->selectRow(
+ 'site_stats',
+ self::selectFields(),
+ [ 'ss_row_id' => 1 ],
+ __METHOD__
+ );
+ }
+
/**
* Is the provided row of site stats sane, or should it be regenerated?
*
* @param bool|object $row
* @return bool
*/
- private static function isSane( $row ) {
+ private static function isRowSane( $row ) {
if ( $row === false
|| $row->ss_total_pages < $row->ss_good_articles
|| $row->ss_total_edits < $row->ss_total_pages
'ss_users',
'ss_images',
] as $member ) {
- if ( $row->$member > 2000000000 || $row->$member < 0 ) {
+ if ( $row->$member < 0 ) {
return false;
}
}
return true;
}
+ /**
+ * @param stdClass|bool $row
+ * @return stdClass
+ */
+ private static function salvageInsaneRow( $row ) {
+ $map = $row ? (array)$row : [];
+ // Fill in any missing values with zero
+ $map += array_fill_keys( self::selectFields(), 0 );
+ // Convert negative values to zero
+ foreach ( $map as $field => $value ) {
+ $map[$field] = max( 0, $value );
+ }
+
+ return (object)$row;
+ }
+
/**
* @return LoadBalancer
*/
/**
* @param int $index
+ * @param string[] $groups
* @return IDatabase
*/
- private static function getDB( $index ) {
- return MediaWikiServices::getInstance()->getDBLoadBalancer()->getConnection( $index );
+ private static function getDB( $index, $groups = [] ) {
+ $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
+
+ return $lb->getConnection( $index, $groups );
}
}
if ( $title ) {
$this->logger->info(
__METHOD__ . ' fell back to READ_LATEST and got a Title.',
- [ 'trace' => wfDebugBacktrace() ]
+ [ 'trace' => wfBacktrace() ]
);
return $title;
}
'showlinkedto' => false,
];
- if ( $config->get( 'AllowCategorizedRecentChanges' ) ) {
- $ret += [
- 'categories' => [
- ApiBase::PARAM_TYPE => 'string',
- ApiBase::PARAM_ISMULTI => true,
- ],
- 'categories_any' => false,
- ];
- }
-
return $ret;
}
"apihelp-feedrecentchanges-param-tagfilter": "فلتر بالوسم.",
"apihelp-feedrecentchanges-param-target": "أحدث التغييرات في الصفحات الموصولة من هذه الصفحة فقط",
"apihelp-feedrecentchanges-param-showlinkedto": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضا عن ذلك",
- "apihelp-feedrecentchanges-param-categories": "أظهر التغييرات في الصفحات في كل تصنيف من هذه التصنيفات فقط.",
- "apihelp-feedrecentchanges-param-categories_any": "أظهر التغييرات في الصفحات في أي تصنيف بدلا من ذلك.",
"apihelp-feedrecentchanges-example-simple": " اظهر التغييرات الحديثة",
"apihelp-feedrecentchanges-example-30days": "أظهر التغييرات الأخيرة في 30 يوم.",
"apihelp-feedwatchlist-summary": "إرجاع تغذية قائمة المراقبة.",
"apihelp-feedrecentchanges-param-tagfilter": "Тэг буйынса һөҙгөс",
"apihelp-feedrecentchanges-param-target": "Был биттән һылтанған биттәрҙә һуңғы үҙгәртеүҙәрҙе күрһәтергә",
"apihelp-feedrecentchanges-param-showlinkedto": "Киреһенсә, был биткә һылтанма яһаған биттәрҙәге үҙгәртеүҙәрҙе күрһәтергә",
- "apihelp-feedrecentchanges-param-categories": "Бар категория биттәрендәге үҙгәрештәрҙе генә күрһәтергә",
- "apihelp-feedrecentchanges-param-categories_any": "Был категориянан башҡа теләһә ҡайһы категориялар биттәрендәге үҙгәрештәрҙе генә күрһәтергә",
"apihelp-feedrecentchanges-example-simple": "Һуңғы үҙгәртеүҙәрҙе күрһәтергә.",
"apihelp-feedrecentchanges-example-30days": "30 көн арауығындағы һуңғы үҙгәртеүҙәрҙе күрһәтергә.",
"apihelp-feedwatchlist-summary": "Күҙәтеү каналын ҡайтара",
"apihelp-feedrecentchanges-param-tagfilter": "Nach Markierung filtern.",
"apihelp-feedrecentchanges-param-target": "Nur Änderungen an Seiten anzeigen, die von dieser Seite verlinkt sind.",
"apihelp-feedrecentchanges-param-showlinkedto": "Zeige Änderungen an Seiten die von der ausgewählten Seite verlinkt sind.",
- "apihelp-feedrecentchanges-param-categories": "Zeigt nur Änderungen von Seiten in all diesen Kategorien.",
- "apihelp-feedrecentchanges-param-categories_any": "Zeigt stattdessen nur Änderungen auf Seiten in einer dieser Kategorien.",
"apihelp-feedrecentchanges-example-simple": "Letzte Änderungen anzeigen",
"apihelp-feedrecentchanges-example-30days": "Letzte Änderungen für 30 Tage anzeigen",
"apihelp-feedwatchlist-summary": "Gibt einen Beobachtungslisten-Feed zurück.",
"apihelp-feedrecentchanges-param-tagfilter": "Filter by tag.",
"apihelp-feedrecentchanges-param-target": "Show only changes on pages linked from this page.",
"apihelp-feedrecentchanges-param-showlinkedto": "Show changes on pages linked to the selected page instead.",
- "apihelp-feedrecentchanges-param-categories": "Show only changes on pages in all of these categories.",
- "apihelp-feedrecentchanges-param-categories_any": "Show only changes on pages in any of the categories instead.",
"apihelp-feedrecentchanges-example-simple": "Show recent changes.",
"apihelp-feedrecentchanges-example-30days": "Show recent changes for 30 days.",
"apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiquetas.",
"apihelp-feedrecentchanges-param-target": "Mostrar solo los cambios en las páginas enlazadas en esta.",
"apihelp-feedrecentchanges-param-showlinkedto": "Mostrar los cambios en páginas enlazadas con la página seleccionada.",
- "apihelp-feedrecentchanges-param-categories": "Mostrar sólo cambios en las páginas en todas estas categorías.",
- "apihelp-feedrecentchanges-param-categories_any": "Mostrar sólo cambios en las páginas en cualquiera de las categorías en lugar.",
"apihelp-feedrecentchanges-example-simple": "Mostrar los cambios recientes.",
"apihelp-feedrecentchanges-example-30days": "Mostrar los cambios recientes limitados a 30 días.",
"apihelp-feedwatchlist-summary": "Devuelve el suministro de una lista de seguimiento.",
"apihelp-feedrecentchanges-param-tagfilter": "Filtrer par balise.",
"apihelp-feedrecentchanges-param-target": "Afficher uniquement les modifications sur les pages liées depuis cette page.",
"apihelp-feedrecentchanges-param-showlinkedto": "Afficher les modifications plutôt sur les pages liées vers la page sélectionnée.",
- "apihelp-feedrecentchanges-param-categories": "Afficher uniquement les modifications sur les pages dans toutes ces catégories",
- "apihelp-feedrecentchanges-param-categories_any": "Afficher plutôt uniquement les modifications sur les pages dans n’importe laquelle de ces catégories.",
"apihelp-feedrecentchanges-example-simple": "Afficher les modifications récentes",
"apihelp-feedrecentchanges-example-30days": "Afficher les modifications récentes sur 30 jours",
"apihelp-feedwatchlist-summary": "Renvoie un flux de liste de suivi.",
"apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiqueta.",
"apihelp-feedrecentchanges-param-target": "Mostrar só os cambios nas páxinas ligadas a esta.",
"apihelp-feedrecentchanges-param-showlinkedto": "Mostrar os cambios nas páxinas ligadas coa páxina seleccionada.",
- "apihelp-feedrecentchanges-param-categories": "Só mostrar cambios en páxinas pertencentes a todas estas categorías.",
- "apihelp-feedrecentchanges-param-categories_any": "Só mostrar cambios en páxinas pertencentes a calquera das categorías.",
"apihelp-feedrecentchanges-example-simple": "Mostrar os cambios recentes",
"apihelp-feedrecentchanges-example-30days": "Mostrar os cambios recentes limitados a 30 días",
"apihelp-feedwatchlist-summary": "Devolve o fluxo dunha lista de vixiancia.",
"apihelp-feedrecentchanges-param-tagfilter": "סינון לפי תגית.",
"apihelp-feedrecentchanges-param-target": "הצגת שינויים שנעשו בדפים המקושרים לדף זה בלבד.",
"apihelp-feedrecentchanges-param-showlinkedto": "להציג את השינויים בדפים שמקושרים לדף שנבחר במקום זה.",
- "apihelp-feedrecentchanges-param-categories": "להציג רק שינויים בדפים בכל הקטגוריות האלו.",
- "apihelp-feedrecentchanges-param-categories_any": "להציג רק שינויים בדפים בכל הקטגוריות במקום.",
"apihelp-feedrecentchanges-example-simple": "הצגת שינויים אחרונים.",
"apihelp-feedrecentchanges-example-30days": "הצגת שינויים אחרונים עבור 30 ימים.",
"apihelp-feedwatchlist-summary": "החזרת הזנת רשימת מעקב.",
"apihelp-feedrecentchanges-param-tagfilter": "Szűrés címke szerint.",
"apihelp-feedrecentchanges-param-target": "Csak a megadott lapról hivatkozott lapok szerkesztéseinek megjelenítése.",
"apihelp-feedrecentchanges-param-showlinkedto": "Inkább a megadott lap''ra'' hivatkozó lapok szerkesztéseinek megjelenítése.",
- "apihelp-feedrecentchanges-param-categories": "Csak a megadott kategóriák mindegyikében szereplő lapok szerkesztéseinek megjelenítése.",
- "apihelp-feedrecentchanges-param-categories_any": "Inkább a megadott kategóriák bármelyikében szereplő lapok szerkesztéseinek megjelenítése.",
"apihelp-feedrecentchanges-example-simple": "Friss változtatások megjelenítése.",
"apihelp-feedrecentchanges-example-30days": "Az elmúlt 30 nap friss változtatásainak megjelenítése.",
"apihelp-feedwatchlist-summary": "A figyelőlista lekérése hírcsatornaként.",
"apihelp-feedrecentchanges-param-tagfilter": "Filtra per etichetta.",
"apihelp-feedrecentchanges-param-target": "Mostra solo le modifiche alle pagine collegate da questa pagina.",
"apihelp-feedrecentchanges-param-showlinkedto": "Mostra solo le modifiche alle pagine collegate a quella specificata.",
- "apihelp-feedrecentchanges-param-categories": "Mostra solo le variazioni sulle pagine di tutte queste categorie.",
- "apihelp-feedrecentchanges-param-categories_any": "Mostra invece solo le variazioni sulle pagine in una qualunque categoria.",
"apihelp-feedrecentchanges-example-simple": "Mostra le ultime modifiche.",
"apihelp-feedrecentchanges-example-30days": "Mostra le modifiche degli ultimi 30 giorni.",
"apihelp-feedwatchlist-param-feedformat": "Il formato del feed.",
"apihelp-feedrecentchanges-param-tagfilter": "Noh Makkehronge beschängke.",
"apihelp-feedrecentchanges-param-target": "Zeijsch Änderonge aan Sigge, op di vun heh dä Sigg ene Lengk jeihd.",
"apihelp-feedrecentchanges-param-showlinkedto": "Zeijsch Änderonge aan Sigge, op di vun dä ußjesöhk Sigg ene Lengk jeihd.",
- "apihelp-feedrecentchanges-param-categories": "Donn blohß de Änderonge aan de Zohjehüreshkeit för all heh di Saachjroppe zeije.",
- "apihelp-feedrecentchanges-param-categories_any": "Donn deföhr blohß de Änderonge aan de Zohjehüreshkeit för öhndseijn fun heh dä Saachjroppe zeije.",
"apihelp-feedrecentchanges-example-simple": "Zeijsch de {{LCFIRST:{{int:recentchanges}}}}",
"apihelp-feedrecentchanges-example-30days": "Zeijsch de {{LCFIRST:{{int:recentchanges}}}} vun de läzde 30 Dähsch.",
"apihelp-feedwatchlist-summary": "Donn ene Kannahl met dä Oppaßleß zerökjävve.",
"apihelp-feedrecentchanges-param-hideliu": "Ännerunge vu registréierte Benotzer verstoppen.",
"apihelp-feedrecentchanges-param-hidemyself": "Ännerunge vum aktuelle Benotzer verstoppen.",
"apihelp-feedrecentchanges-param-hidecategorization": "Ännerunge vun der Memberschaft a Kategorie verstoppen.",
- "apihelp-feedrecentchanges-param-categories": "Nëmmen Ännerunge vu Säiten aus all dëse Kategorië weisen.",
- "apihelp-feedrecentchanges-param-categories_any": "Nëmmen Ännerunge vu Säiten aus enger vun dëse Kategorië weisen.",
"apihelp-feedrecentchanges-example-simple": "Rezent Ännerunge weisen",
"apihelp-filerevert-param-comment": "Bemierkung eroplueden.",
"apihelp-help-example-main": "Hëllef fir den Haaptmodul.",
"apihelp-feedrecentchanges-param-tagfilter": "Filtruoti pagal žymę.",
"apihelp-feedrecentchanges-param-target": "Rodyti tik keitimus puslapiuose, pasiekiamuose iš šio puslapio.",
"apihelp-feedrecentchanges-param-showlinkedto": "Vietoj to, rodyti pakeitimus puslapyje, susietame su pasirinktu puslapiu.",
- "apihelp-feedrecentchanges-param-categories": "Rodyti pakeitimus tik puslapiuose, esančiuose visuose šiuose kategorijose.",
- "apihelp-feedrecentchanges-param-categories_any": "Vietoj to, rodyti tik pakeitimus puslapiuse, esančiuose bet kurioje iš kategorijų.",
"apihelp-feedrecentchanges-example-simple": "Parodyti naujausius keitimus.",
"apihelp-feedrecentchanges-example-30days": "Rodyti naujausius pakeitimus per 30 dienų.",
"apihelp-feedwatchlist-summary": "Gražina stebimųjų sąrašo srautą.",
"apihelp-feedrecentchanges-param-tagfilter": "Филтрирање по ознака.",
"apihelp-feedrecentchanges-param-target": "Прикажи само промени на страници што водат од оваа.",
"apihelp-feedrecentchanges-param-showlinkedto": "Наместо тоа, прикажи ги промените на страниците поврзани со избраната страница.",
- "apihelp-feedrecentchanges-param-categories": "Прикажи само промени на страниците во сите овие категории.",
- "apihelp-feedrecentchanges-param-categories_any": "Прикажи само промени на страниците во било која од категориите.",
"apihelp-feedrecentchanges-example-simple": "Прикажи скорешни промени",
"apihelp-feedrecentchanges-example-30days": "Прикажувај скорешни промени 30 дена",
"apihelp-feedwatchlist-summary": "Дава тековник со набљудуваните.",
"apihelp-feedrecentchanges-param-tagfilter": "Filtrer etter tagger.",
"apihelp-feedrecentchanges-param-target": "Vis bare endringer på sider som lenkes fra denne siden.",
"apihelp-feedrecentchanges-param-showlinkedto": "Vis endringer på sider som lenker til den valgte siden i stedet.",
- "apihelp-feedrecentchanges-param-categories": "Vis bare endringer på sider i alle disse kategoriene.",
- "apihelp-feedrecentchanges-param-categories_any": "Vis bare endringer på sider som er i noen av kategoriene i stedet.",
"apihelp-feedrecentchanges-example-simple": "Vis siste endringer.",
"apihelp-feedrecentchanges-example-30days": "Vis siste endringer for 30 døgn.",
"apihelp-feedwatchlist-summary": "Returnerer en overvåkningslistemating.",
"apihelp-feedrecentchanges-param-tagfilter": "Filtruj po znacznikach.",
"apihelp-feedrecentchanges-param-target": "Pokaż tylko zmiany na stronach linkowanych z tej strony.",
"apihelp-feedrecentchanges-param-showlinkedto": "Pokaż zmiany na stronach linkujących do wybranej strony.",
- "apihelp-feedrecentchanges-param-categories": "Pokaż zmiany tylko na stronach będących we wszystkich tych kategoriach.",
- "apihelp-feedrecentchanges-param-categories_any": "Pokaż zmiany tylko na stronach będących w jednej z tych kategorii.",
"apihelp-feedrecentchanges-example-simple": "Pokaż ostatnie zmiany.",
"apihelp-feedrecentchanges-example-30days": "Pokaż ostatnie zmiany z 30 dni.",
"apihelp-feedwatchlist-summary": "Zwraca kanał listy obserwowanych.",
"apihelp-feedrecentchanges-param-tagfilter": "Filtrar por tag.",
"apihelp-feedrecentchanges-param-target": "Mostrar apenas as alterações nas páginas vinculadas por esta página.",
"apihelp-feedrecentchanges-param-showlinkedto": "Mostra as alterações nas páginas vigiadas à página selecionada.",
- "apihelp-feedrecentchanges-param-categories": "Mostre apenas as alterações em páginas em todas essas categorias.",
- "apihelp-feedrecentchanges-param-categories_any": "Mostre apenas as alterações em páginas em qualquer uma das categorias.",
"apihelp-feedrecentchanges-example-simple": "Mostrar as mudanças recentes.",
"apihelp-feedrecentchanges-example-30days": "Mostrar as mudanças recentes por 30 dias.",
"apihelp-feedwatchlist-summary": "Retornar um feed da lista de páginas vigiadas.",
"apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiqueta.",
"apihelp-feedrecentchanges-param-target": "Mostrar apenas mudanças em páginas afluentes a esta.",
"apihelp-feedrecentchanges-param-showlinkedto": "Mostrar mudanças em páginas com hiperligações para a página selecionada.",
- "apihelp-feedrecentchanges-param-categories": "Mostrar apenas mudanças nas páginas que estão em todas estas categorias.",
- "apihelp-feedrecentchanges-param-categories_any": "Mostrar apenas mudanças nas páginas que estão em qualquer uma das categorias.",
"apihelp-feedrecentchanges-example-simple": "Mostrar mudanças recentes.",
"apihelp-feedrecentchanges-example-30days": "Mostrar as mudanças recentes de 30 dias.",
"apihelp-feedwatchlist-summary": "Devolve um ''feed'' das páginas vigiadas.",
"apihelp-parse-param-disablepp": "Em vez deste, usar <var>$1disablelimitreport</var>.",
"apihelp-parse-param-disableeditsection": "Omitir as hiperligações para edição da secção no resultado da análise sintática.",
"apihelp-parse-param-disabletidy": "Não fazer a limpeza do HTML (isto é, o ''tidy'') no resultado da análise sintática.",
+ "apihelp-parse-param-disablestylededuplication": "Não desduplica as folhas de estilo incluídas na saída do analisador sintático.",
"apihelp-parse-param-generatexml": "Gerar a árvore de análise XML (requer o modelo de conteúdo <code>$1</code>; substituído por <kbd>$2prop=parsetree</kbd>).",
"apihelp-parse-param-preview": "Executar a análise em modo de antevisão.",
"apihelp-parse-param-sectionpreview": "Executar a análise em modo de antevisão (também ativa o modo de antevisão).",
"apihelp-feedrecentchanges-param-tagfilter": "{{doc-apihelp-param|feedrecentchanges|tagfilter}}",
"apihelp-feedrecentchanges-param-target": "{{doc-apihelp-param|feedrecentchanges|target}}",
"apihelp-feedrecentchanges-param-showlinkedto": "{{doc-apihelp-param|feedrecentchanges|showlinkedto}}",
- "apihelp-feedrecentchanges-param-categories": "{{doc-apihelp-param|feedrecentchanges|categories}}",
- "apihelp-feedrecentchanges-param-categories_any": "{{doc-apihelp-param|feedrecentchanges|categories_any}}",
"apihelp-feedrecentchanges-example-simple": "{{doc-apihelp-example|feedrecentchanges}}",
"apihelp-feedrecentchanges-example-30days": "{{doc-apihelp-example|feedrecentchanges}}",
"apihelp-feedwatchlist-summary": "{{doc-apihelp-summary|feedwatchlist}}",
"apihelp-feedrecentchanges-param-tagfilter": "Фильтр по меткам.",
"apihelp-feedrecentchanges-param-target": "Показать только правки на страницах, на которые ссылается данная.",
"apihelp-feedrecentchanges-param-showlinkedto": "Показать правки на страницах, ссылающихся на данную.",
- "apihelp-feedrecentchanges-param-categories": "Показать только правки на страницах, включённых во все данные категории.",
- "apihelp-feedrecentchanges-param-categories_any": "Показать только правки на страницах, включённых в хотя бы одну из данных категорий.",
"apihelp-feedrecentchanges-example-simple": "Список последних изменений.",
"apihelp-feedrecentchanges-example-30days": "Список последних изменений за 30 дней.",
"apihelp-feedwatchlist-summary": "Возвращает ленту списка наблюдения.",
"apihelp-feedrecentchanges-param-tagfilter": "Filtrera efter tagg.",
"apihelp-feedrecentchanges-param-target": "Visa endast ändringarna av sidor som den här sidan länkar till.",
"apihelp-feedrecentchanges-param-showlinkedto": "Visa ändringarna på sidor som är länkade till den valda sidan i stället.",
- "apihelp-feedrecentchanges-param-categories": "Visa endast ändringar på sidor i alla dessa kategorier.",
- "apihelp-feedrecentchanges-param-categories_any": "Visa endast ändringar på sidor i någon av kategorierna istället.",
"apihelp-feedrecentchanges-example-simple": "Visa senaste ändringar",
"apihelp-feedrecentchanges-example-30days": "Visa senaste ändringar för 30 dygn",
"apihelp-feedwatchlist-summary": "Returnerar ett flöde från bevakningslistan.",
"apihelp-feedrecentchanges-param-tagfilter": "Фільтрувати за теґом.",
"apihelp-feedrecentchanges-param-target": "Показати лише зміни на сторінках, на які посилається ця сторінка.",
"apihelp-feedrecentchanges-param-showlinkedto": "Показати натомість лише зміни на сторінках, які посилаються на цю сторінку.",
- "apihelp-feedrecentchanges-param-categories": "Показати лише зміни сторінок у всіх цих категоріях.",
- "apihelp-feedrecentchanges-param-categories_any": "Показати натомість лише зміни на сторінках у будь-якій з цих категорій.",
"apihelp-feedrecentchanges-example-simple": "Показати нещодавні зміни.",
"apihelp-feedrecentchanges-example-30days": "Показати нещодавні зміни за 30 днів.",
"apihelp-feedwatchlist-summary": "Видає стрічку списку спостереження.",
"apihelp-feedrecentchanges-param-tagfilter": "按标签过滤。",
"apihelp-feedrecentchanges-param-target": "仅仅显示从该页面链出的那些页面的变更。",
"apihelp-feedrecentchanges-param-showlinkedto": "仅仅显示链入到该页面的那些页面的变更。",
- "apihelp-feedrecentchanges-param-categories": "只显示所有这些分类中的页面上的更改。",
- "apihelp-feedrecentchanges-param-categories_any": "只显示这些分类以外页面的更改。",
"apihelp-feedrecentchanges-example-simple": "显示最近更改。",
"apihelp-feedrecentchanges-example-30days": "显示最近30天的更改。",
"apihelp-feedwatchlist-summary": "返回监视列表纲要。",
}
function __destruct() {
- if ( $this->mOpened ) {
+ if ( $this->opened ) {
Wikimedia\suppressWarnings();
$this->close();
Wikimedia\restoreWarnings();
}
$this->close();
- $this->mUser = $user;
- $this->mPassword = $password;
+ $this->user = $user;
+ $this->password = $password;
// changed internal variables functions
// mServer now holds the TNS endpoint
// mDBname is schema name if different from username
if ( !$server ) {
// backward compatibillity (server used to be null and TNS was supplied in dbname)
- $this->mServer = $dbName;
- $this->mDBname = $user;
+ $this->server = $dbName;
+ $this->dbName = $user;
} else {
- $this->mServer = $server;
+ $this->server = $server;
if ( !$dbName ) {
- $this->mDBname = $user;
+ $this->dbName = $user;
} else {
- $this->mDBname = $dbName;
+ $this->dbName = $dbName;
}
}
$this->setFlag( DBO_PERSISTENT );
}
- $session_mode = $this->mFlags & DBO_SYSDBA ? OCI_SYSDBA : OCI_DEFAULT;
+ $session_mode = $this->flags & DBO_SYSDBA ? OCI_SYSDBA : OCI_DEFAULT;
Wikimedia\suppressWarnings();
- if ( $this->mFlags & DBO_PERSISTENT ) {
- $this->mConn = oci_pconnect(
- $this->mUser,
- $this->mPassword,
- $this->mServer,
+ if ( $this->flags & DBO_PERSISTENT ) {
+ $this->conn = oci_pconnect(
+ $this->user,
+ $this->password,
+ $this->server,
$this->defaultCharset,
$session_mode
);
- } elseif ( $this->mFlags & DBO_DEFAULT ) {
- $this->mConn = oci_new_connect(
- $this->mUser,
- $this->mPassword,
- $this->mServer,
+ } elseif ( $this->flags & DBO_DEFAULT ) {
+ $this->conn = oci_new_connect(
+ $this->user,
+ $this->password,
+ $this->server,
$this->defaultCharset,
$session_mode
);
} else {
- $this->mConn = oci_connect(
- $this->mUser,
- $this->mPassword,
- $this->mServer,
+ $this->conn = oci_connect(
+ $this->user,
+ $this->password,
+ $this->server,
$this->defaultCharset,
$session_mode
);
}
Wikimedia\restoreWarnings();
- if ( $this->mUser != $this->mDBname ) {
+ if ( $this->user != $this->dbName ) {
// change current schema in session
- $this->selectDB( $this->mDBname );
+ $this->selectDB( $this->dbName );
}
- if ( !$this->mConn ) {
+ if ( !$this->conn ) {
throw new DBConnectionError( $this, $this->lastError() );
}
- $this->mOpened = true;
+ $this->opened = true;
# removed putenv calls because they interfere with the system globaly
$this->doQuery( 'ALTER SESSION SET NLS_TIMESTAMP_FORMAT=\'DD-MM-YYYY HH24:MI:SS.FF6\'' );
$this->doQuery( 'ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT=\'DD-MM-YYYY HH24:MI:SS.FF6\'' );
$this->doQuery( 'ALTER SESSION SET NLS_NUMERIC_CHARACTERS=\'.,\'' );
- return $this->mConn;
+ return $this->conn;
}
/**
* @return bool
*/
protected function closeConnection() {
- return oci_close( $this->mConn );
+ return oci_close( $this->conn );
}
function execFlags() {
- return $this->mTrxLevel ? OCI_NO_AUTO_COMMIT : OCI_COMMIT_ON_SUCCESS;
+ return $this->trxLevel ? OCI_NO_AUTO_COMMIT : OCI_COMMIT_ON_SUCCESS;
}
protected function doQuery( $sql ) {
Wikimedia\suppressWarnings();
- $this->mLastResult = $stmt = oci_parse( $this->mConn, $sql );
+ $this->mLastResult = $stmt = oci_parse( $this->conn, $sql );
if ( $stmt === false ) {
- $e = oci_error( $this->mConn );
+ $e = oci_error( $this->conn );
$this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
return false;
}
function lastError() {
- if ( $this->mConn === false ) {
+ if ( $this->conn === false ) {
$e = oci_error();
} else {
- $e = oci_error( $this->mConn );
+ $e = oci_error( $this->conn );
}
return $e['message'];
}
function lastErrno() {
- if ( $this->mConn === false ) {
+ if ( $this->conn === false ) {
$e = oci_error();
} else {
- $e = oci_error( $this->mConn );
+ $e = oci_error( $this->conn );
}
return $e['code'];
}
$sql .= ')';
- $this->mLastResult = $stmt = oci_parse( $this->mConn, $sql );
+ $this->mLastResult = $stmt = oci_parse( $this->conn, $sql );
if ( $stmt === false ) {
- $e = oci_error( $this->mConn );
+ $e = oci_error( $this->conn );
$this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
return false;
}
} else {
/** @var OCI_Lob[] $lob */
- $lob[$col] = oci_new_descriptor( $this->mConn, OCI_D_LOB );
+ $lob[$col] = oci_new_descriptor( $this->conn, OCI_D_LOB );
if ( $lob[$col] === false ) {
$e = oci_error( $stmt );
throw new DBUnexpectedError( $this, "Cannot create LOB descriptor: " . $e['message'] );
}
}
- if ( !$this->mTrxLevel ) {
- oci_commit( $this->mConn );
+ if ( !$this->trxLevel ) {
+ oci_commit( $this->conn );
}
return oci_free_statement( $stmt );
FROM all_sequences asq, all_tab_columns atc
WHERE decode(
atc.table_name,
- '{$this->mTablePrefix}MWUSER',
- '{$this->mTablePrefix}USER',
+ '{$this->tablePrefix}MWUSER',
+ '{$this->tablePrefix}USER',
atc.table_name
) || '_' ||
- atc.column_name || '_SEQ' = '{$this->mTablePrefix}' || asq.sequence_name
- AND asq.sequence_owner = upper('{$this->mDBname}')
- AND atc.owner = upper('{$this->mDBname}')" );
+ atc.column_name || '_SEQ' = '{$this->tablePrefix}' || asq.sequence_name
+ AND asq.sequence_owner = upper('{$this->dbName}')
+ AND atc.owner = upper('{$this->dbName}')" );
while ( ( $row = $result->fetchRow() ) !== false ) {
$this->sequenceData[$row[1]] = [
$newName = strtoupper( $newName );
$oldName = strtoupper( $oldName );
- $tabName = substr( $newName, strlen( $this->mTablePrefix ) );
+ $tabName = substr( $newName, strlen( $this->tablePrefix ) );
$oldPrefix = substr( $oldName, 0, strlen( $oldName ) - strlen( $tabName ) );
- $newPrefix = strtoupper( $this->mTablePrefix );
+ $newPrefix = strtoupper( $this->tablePrefix );
return $this->doQuery( "BEGIN DUPLICATE_TABLE( '$tabName', " .
"'$oldPrefix', '$newPrefix', $temporary ); END;" );
$listWhere = ' AND table_name LIKE \'' . strtoupper( $prefix ) . '%\'';
}
- $owner = strtoupper( $this->mDBname );
+ $owner = strtoupper( $this->dbName );
$result = $this->doQuery( "SELECT table_name FROM all_tables " .
"WHERE owner='$owner' AND table_name NOT LIKE '%!_IDX\$_' ESCAPE '!' $listWhere" );
);
$row = $rset->fetchRow();
if ( !$row ) {
- return oci_server_version( $this->mConn );
+ return oci_server_version( $this->conn );
}
return $row['version'];
$table = $this->tableName( $table );
$table = strtoupper( $this->removeIdentifierQuotes( $table ) );
$index = strtoupper( $index );
- $owner = strtoupper( $this->mDBname );
+ $owner = strtoupper( $this->dbName );
$sql = "SELECT 1 FROM all_indexes WHERE owner='$owner' AND index_name='{$table}_{$index}'";
$res = $this->doQuery( $sql );
if ( $res ) {
function tableExists( $table, $fname = __METHOD__ ) {
$table = $this->tableName( $table );
$table = $this->addQuotes( strtoupper( $this->removeIdentifierQuotes( $table ) ) );
- $owner = $this->addQuotes( strtoupper( $this->mDBname ) );
+ $owner = $this->addQuotes( strtoupper( $this->dbName ) );
$sql = "SELECT 1 FROM all_tables WHERE owner=$owner AND table_name=$table";
$res = $this->doQuery( $sql );
if ( $res && $res->numRows() > 0 ) {
}
$fieldInfoStmt = oci_parse(
- $this->mConn,
+ $this->conn,
'SELECT * FROM wiki_field_info_full WHERE table_name ' .
$tableWhere . ' and column_name = \'' . $field . '\''
);
}
protected function doBegin( $fname = __METHOD__ ) {
- $this->mTrxLevel = 1;
+ $this->trxLevel = 1;
$this->doQuery( 'SET CONSTRAINTS ALL DEFERRED' );
}
protected function doCommit( $fname = __METHOD__ ) {
- if ( $this->mTrxLevel ) {
- $ret = oci_commit( $this->mConn );
+ if ( $this->trxLevel ) {
+ $ret = oci_commit( $this->conn );
if ( !$ret ) {
throw new DBUnexpectedError( $this, $this->lastError() );
}
- $this->mTrxLevel = 0;
+ $this->trxLevel = 0;
$this->doQuery( 'SET CONSTRAINTS ALL IMMEDIATE' );
}
}
protected function doRollback( $fname = __METHOD__ ) {
- if ( $this->mTrxLevel ) {
- oci_rollback( $this->mConn );
- $this->mTrxLevel = 0;
+ if ( $this->trxLevel ) {
+ oci_rollback( $this->conn );
+ $this->trxLevel = 0;
$this->doQuery( 'SET CONSTRAINTS ALL IMMEDIATE' );
}
}
}
function selectDB( $db ) {
- $this->mDBname = $db;
- if ( $db == null || $db == $this->mUser ) {
+ $this->dbName = $db;
+ if ( $db == null || $db == $this->user ) {
return true;
}
$sql = 'ALTER SESSION SET CURRENT_SCHEMA=' . strtoupper( $db );
- $stmt = oci_parse( $this->mConn, $sql );
+ $stmt = oci_parse( $this->conn, $sql );
Wikimedia\suppressWarnings();
$success = oci_execute( $stmt );
Wikimedia\restoreWarnings();
$sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
}
- $this->mLastResult = $stmt = oci_parse( $this->mConn, $sql );
+ $this->mLastResult = $stmt = oci_parse( $this->conn, $sql );
if ( $stmt === false ) {
- $e = oci_error( $this->mConn );
+ $e = oci_error( $this->conn );
$this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
return false;
}
} else {
/** @var OCI_Lob[] $lob */
- $lob[$col] = oci_new_descriptor( $this->mConn, OCI_D_LOB );
+ $lob[$col] = oci_new_descriptor( $this->conn, OCI_D_LOB );
if ( $lob[$col] === false ) {
$e = oci_error( $stmt );
throw new DBUnexpectedError( $this, "Cannot create LOB descriptor: " . $e['message'] );
}
}
- if ( !$this->mTrxLevel ) {
- oci_commit( $this->mConn );
+ if ( !$this->trxLevel ) {
+ oci_commit( $this->conn );
}
return oci_free_statement( $stmt );
}
function getDBname() {
- return $this->mDBname;
+ return $this->dbName;
}
function getServer() {
- return $this->mServer;
+ return $this->server;
}
public function buildGroupConcatField(
$pd = [];
if ( $config->get( 'SiteStatsAsyncFactor' ) ) {
// Lock the table so we don't have double DB/memcached updates
- if ( !$dbw->lockIsFree( $lockKey, __METHOD__ )
- || !$dbw->lock( $lockKey, __METHOD__, 1 ) // 1 sec timeout
- ) {
+ if ( !$dbw->lock( $lockKey, __METHOD__, 0 ) ) {
$this->doUpdatePendingDeltas();
return;
} elseif ( self::isCommandLine() ) {
$message = $this->getText();
// T17602: STDERR may not be available
- if ( defined( 'STDERR' ) ) {
+ if ( !defined( 'MW_PHPUNIT_TEST' ) && defined( 'STDERR' ) ) {
fwrite( STDERR, $message );
} else {
echo $message;
"config-apc": "[http://www.php.net/apc APC] ta instaláu",
"config-apcu": "[http://www.php.net/apcu APCu] ta instaláu",
"config-wincache": "[https://www.iis.net/download/WinCacheForPhp WinCache] ta instaláu",
- "config-no-cache-apcu": "<strong>Warning:</strong> Non pudo atopase[http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].\nEl caxé d'oxetos nun ta activáu.",
+ "config-no-cache-apcu": "<strong>Atención:</strong> Nun pudo alcontrase [http://www.php.net/apcu APCu] o [http://www.iis.net/download/WinCacheForPhp WinCache].\nLa caché d'oxetos nun ta activada.",
"config-mod-security": "<strong>Alvertencia:</strong> El to servidor web tien activáu [https://modsecurity.org/mod_security]/mod_security2 .Munches de les sos configuraciones comunes pueden causar problemes a MediaWiki o otru software que dexe a los usuarios publicar conteníu arbitrario. De ser posible, tendríes de desactivalo. Si non, consulta la [https://modsecurity.org/documentation/ mod_security documentation] o contacta col alministrador del to servidor si atopes erros aleatorios.",
"config-diff3-bad": "Nun s'alcontró GNU diff3.",
"config-git": "Alcontróse'l software de control de versiones Git: <code>$1</code>.",
"config-apc": "[http://www.php.net/apc APC] är installerat",
"config-apcu": "[http://www.php.net/apcu APCu] är installerat",
"config-wincache": "[https://www.iis.net/download/WinCacheForPhp WinCache] är installerat",
- "config-no-cache-apcu": "'''Varning:''' Kunde inte hitta [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] eller [http://www.iis.net/download/WinCacheForPhp WinCache].\nCachelagring av objekt är inte aktiverat.",
+ "config-no-cache-apcu": "<strong>Varning:</strong> Kunde inte hitta [http://www.php.net/apcu APCu] eller [http://www.iis.net/download/WinCacheForPhp WinCache].\nCachelagring av objekt är inte aktiverat.",
"config-mod-security": "'''Varning:''' Din webbserver har [https://modsecurity.org/ mod_security] aktiverat. Om felaktigt konfigurerat kan den skapa problem för MediaWiki eller annan programvara som tillåter användaren att posta godtyckligt innehåll.\nTitta på [https://modsecurity.org/documentation/ mod_security-dokumentationen] eller kontakta din värd om du påträffar slumpmässiga fel.",
"config-diff3-bad": "GNU diff3 hittades inte.",
"config-git": "Hittade Git-mjukvara för versionskontroll: <code>$1</code>.",
"config-cache-options": "Inställningar för cachelagring av objekt:",
"config-cache-help": "Cachelagring av objekt används för att förbättra hastigheten på MediaWiki genom att cachelagra data som används ofta.\nMedelstora till stora webbplatser är starkt uppmuntrade att aktivera detta, och små webbplatser kommer även att se fördelar.",
"config-cache-none": "Ingen cachelagring (ingen funktionalitet tas bort, men hastighet kan påverkas på större wiki-webbplatser)",
- "config-cache-accel": "Cachelagring av PHP-objekt (APC, APCu, XCache eller WinCache)",
+ "config-cache-accel": "Cachelagring av PHP-objekt (APC, APCu eller WinCache)",
"config-cache-memcached": "Använda Memcached (kräver ytterligare inställningar och konfiguration)",
"config-memcached-servers": "Memcached-servrar:",
"config-memcached-help": "Lista över IP-adresser som ska användas för Memcached.\nBör ange en per rad och specificera den port som ska användas. Till exempel:\n 127.0.0.1:11211\n 192.168.1.25:1234",
$lockKey = wfWikiID() . ':recentchanges-prune';
$dbw = wfGetDB( DB_MASTER );
- if ( !$dbw->lockIsFree( $lockKey, __METHOD__ )
- || !$dbw->lock( $lockKey, __METHOD__, 1 )
- ) {
- return; // already in progress
+ if ( !$dbw->lock( $lockKey, __METHOD__, 0 ) ) {
+ // already in progress
+ return;
}
$factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
$dbw->setSessionOptions( [ 'connTimeout' => 900 ] );
$lockKey = wfWikiID() . '-activeusers';
- if ( !$dbw->lockIsFree( $lockKey, __METHOD__ ) || !$dbw->lock( $lockKey, __METHOD__, 1 ) ) {
+ if ( !$dbw->lock( $lockKey, __METHOD__, 0 ) ) {
// Exclusive update (avoids duplicate entries)… it's usually fine to just drop out here,
// if the Job is already running.
return;
--- /dev/null
+<?php
+/**
+ * Job that purges expired user group memberships.
+ *
+ * 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+class UserGroupExpiryJob extends Job {
+ public function __construct( $params = false ) {
+ parent::__construct( 'userGroupExpiry', Title::newMainPage(), $params );
+ $this->removeDuplicates = true;
+ }
+
+ /**
+ * Run the job
+ * @return bool Success
+ */
+ public function run() {
+ UserGroupMembership::purgeExpired();
+
+ return true;
+ }
+}
}
/**
- * Locally set a key to expire soon if it is stale based on $purgeTimestamp
+ * Set a key to soon expire in the local cluster if it pre-dates $purgeTimestamp
*
* This sets stale keys' time-to-live at HOLDOFF_TTL seconds, which both avoids
* broadcasting in mcrouter setups and also avoids races with new tombstones.
}
/**
- * Locally set a "check" key to expire soon if it is stale based on $purgeTimestamp
+ * Set a "check" key to soon expire in the local cluster if it pre-dates $purgeTimestamp
*
* @param string $key Cache key
* @param int $purgeTimestamp UNIX timestamp of purge
const SMALL_WRITE_ROWS = 100;
/** @var string SQL query */
- protected $mLastQuery = '';
+ protected $lastQuery = '';
/** @var float|bool UNIX timestamp of last write query */
- protected $mLastWriteTime = false;
+ protected $lastWriteTime = false;
/** @var string|bool */
- protected $mPHPError = false;
+ protected $phpError = false;
/** @var string */
- protected $mServer;
+ protected $server;
/** @var string */
- protected $mUser;
+ protected $user;
/** @var string */
- protected $mPassword;
+ protected $password;
/** @var string */
- protected $mDBname;
+ protected $dbName;
/** @var array[] $aliases Map of (table => (dbname, schema, prefix) map) */
protected $tableAliases = [];
/** @var bool Whether this PHP instance is for a CLI script */
protected $errorLogger;
/** @var resource|null Database connection */
- protected $mConn = null;
+ protected $conn = null;
/** @var bool */
- protected $mOpened = false;
+ protected $opened = false;
/** @var array[] List of (callable, method name) */
- protected $mTrxIdleCallbacks = [];
+ protected $trxIdleCallbacks = [];
/** @var array[] List of (callable, method name) */
- protected $mTrxPreCommitCallbacks = [];
+ protected $trxPreCommitCallbacks = [];
/** @var array[] List of (callable, method name) */
- protected $mTrxEndCallbacks = [];
+ protected $trxEndCallbacks = [];
/** @var callable[] Map of (name => callable) */
- protected $mTrxRecurringCallbacks = [];
+ protected $trxRecurringCallbacks = [];
/** @var bool Whether to suppress triggering of transaction end callbacks */
- protected $mTrxEndCallbacksSuppressed = false;
+ protected $trxEndCallbacksSuppressed = false;
/** @var string */
- protected $mTablePrefix = '';
+ protected $tablePrefix = '';
/** @var string */
- protected $mSchema = '';
+ protected $schema = '';
/** @var int */
- protected $mFlags;
+ protected $flags;
/** @var array */
- protected $mLBInfo = [];
- /** @var bool|null */
- protected $mDefaultBigSelects = null;
+ protected $lbInfo = [];
/** @var array|bool */
- protected $mSchemaVars = false;
+ protected $schemaVars = false;
/** @var array */
- protected $mSessionVars = [];
+ protected $sessionVars = [];
/** @var array|null */
protected $preparedArgs;
/** @var string|bool|null Stashed value of html_errors INI setting */
*
* @var int
*/
- protected $mTrxLevel = 0;
+ protected $trxLevel = 0;
/**
* Either a short hexidecimal string if a transaction is active or ""
*
* @var string
- * @see Database::mTrxLevel
+ * @see Database::trxLevel
*/
- protected $mTrxShortId = '';
+ protected $trxShortId = '';
/**
* The UNIX time that the transaction started. Callers can assume that if
* snapshot isolation is used, then the data is *at least* up to date to that
* point (possibly more up-to-date since the first SELECT defines the snapshot).
*
* @var float|null
- * @see Database::mTrxLevel
+ * @see Database::trxLevel
*/
- private $mTrxTimestamp = null;
+ private $trxTimestamp = null;
/** @var float Lag estimate at the time of BEGIN */
- private $mTrxReplicaLag = null;
+ private $trxReplicaLag = null;
/**
* Remembers the function name given for starting the most recent transaction via begin().
* Used to provide additional context for error reporting.
*
* @var string
- * @see Database::mTrxLevel
+ * @see Database::trxLevel
*/
- private $mTrxFname = null;
+ private $trxFname = null;
/**
* Record if possible write queries were done in the last transaction started
*
* @var bool
- * @see Database::mTrxLevel
+ * @see Database::trxLevel
*/
- private $mTrxDoneWrites = false;
+ private $trxDoneWrites = false;
/**
* Record if the current transaction was started implicitly due to DBO_TRX being set.
*
* @var bool
- * @see Database::mTrxLevel
+ * @see Database::trxLevel
*/
- private $mTrxAutomatic = false;
+ private $trxAutomatic = false;
/**
* Array of levels of atomicity within transactions
*
* @var array
*/
- private $mTrxAtomicLevels = [];
+ private $trxAtomicLevels = [];
/**
* Record if the current transaction was started implicitly by Database::startAtomic
*
* @var bool
*/
- private $mTrxAutomaticAtomic = false;
+ private $trxAutomaticAtomic = false;
/**
* Track the write query callers of the current transaction
*
* @var string[]
*/
- private $mTrxWriteCallers = [];
+ private $trxWriteCallers = [];
/**
* @var float Seconds spent in write queries for the current transaction
*/
- private $mTrxWriteDuration = 0.0;
+ private $trxWriteDuration = 0.0;
/**
* @var int Number of write queries for the current transaction
*/
- private $mTrxWriteQueryCount = 0;
+ private $trxWriteQueryCount = 0;
/**
* @var int Number of rows affected by write queries for the current transaction
*/
- private $mTrxWriteAffectedRows = 0;
+ private $trxWriteAffectedRows = 0;
/**
- * @var float Like mTrxWriteQueryCount but excludes lock-bound, easy to replicate, queries
+ * @var float Like trxWriteQueryCount but excludes lock-bound, easy to replicate, queries
*/
- private $mTrxWriteAdjDuration = 0.0;
+ private $trxWriteAdjDuration = 0.0;
/**
- * @var int Number of write queries counted in mTrxWriteAdjDuration
+ * @var int Number of write queries counted in trxWriteAdjDuration
*/
- private $mTrxWriteAdjQueryCount = 0;
+ private $trxWriteAdjQueryCount = 0;
/**
* @var float RTT time estimate
*/
- private $mRTTEstimate = 0.0;
+ private $rttEstimate = 0.0;
/** @var array Map of (name => 1) for locks obtained via lock() */
- private $mNamedLocksHeld = [];
+ private $namedLocksHeld = [];
/** @var array Map of (table name => 1) for TEMPORARY tables */
- protected $mSessionTempTables = [];
+ protected $sessionTempTables = [];
/** @var IDatabase|null Lazy handle to the master DB this server replicates from */
private $lazyMasterHandle;
/** @var float UNIX timestamp */
protected $lastPing = 0.0;
- /** @var int[] Prior mFlags values */
+ /** @var int[] Prior flags member variable values */
private $priorFlags = [];
/** @var object|string Class name or object With profileIn/profileOut methods */
$password = $params['password'];
$dbName = $params['dbname'];
- $this->mSchema = $params['schema'];
- $this->mTablePrefix = $params['tablePrefix'];
+ $this->schema = $params['schema'];
+ $this->tablePrefix = $params['tablePrefix'];
$this->cliMode = $params['cliMode'];
// Agent name is added to SQL queries in a comment, so make sure it can't break out
$this->agent = str_replace( '/', '-', $params['agent'] );
- $this->mFlags = $params['flags'];
- if ( $this->mFlags & self::DBO_DEFAULT ) {
+ $this->flags = $params['flags'];
+ if ( $this->flags & self::DBO_DEFAULT ) {
if ( $this->cliMode ) {
- $this->mFlags &= ~self::DBO_TRX;
+ $this->flags &= ~self::DBO_TRX;
} else {
- $this->mFlags |= self::DBO_TRX;
+ $this->flags |= self::DBO_TRX;
}
}
- $this->mSessionVars = $params['variables'];
+ $this->sessionVars = $params['variables'];
$this->srvCache = isset( $params['srvCache'] )
? $params['srvCache']
}
// Set the domain object after open() sets the relevant fields
- if ( $this->mDBname != '' ) {
+ if ( $this->dbName != '' ) {
// Domains with server scope but a table prefix are not used by IDatabase classes
- $this->currentDomain = new DatabaseDomain( $this->mDBname, null, $this->mTablePrefix );
+ $this->currentDomain = new DatabaseDomain( $this->dbName, null, $this->tablePrefix );
}
}
if ( $ignoreErrors !== null ) {
// setFlag()/clearFlag() do not allow DBO_IGNORE changes for sanity
if ( $ignoreErrors ) {
- $this->mFlags |= self::DBO_IGNORE;
+ $this->flags |= self::DBO_IGNORE;
} else {
- $this->mFlags &= ~self::DBO_IGNORE;
+ $this->flags &= ~self::DBO_IGNORE;
}
}
}
public function trxLevel() {
- return $this->mTrxLevel;
+ return $this->trxLevel;
}
public function trxTimestamp() {
- return $this->mTrxLevel ? $this->mTrxTimestamp : null;
+ return $this->trxLevel ? $this->trxTimestamp : null;
}
public function tablePrefix( $prefix = null ) {
- $old = $this->mTablePrefix;
+ $old = $this->tablePrefix;
if ( $prefix !== null ) {
- $this->mTablePrefix = $prefix;
- $this->currentDomain = ( $this->mDBname != '' )
- ? new DatabaseDomain( $this->mDBname, null, $this->mTablePrefix )
+ $this->tablePrefix = $prefix;
+ $this->currentDomain = ( $this->dbName != '' )
+ ? new DatabaseDomain( $this->dbName, null, $this->tablePrefix )
: DatabaseDomain::newUnspecified();
}
}
public function dbSchema( $schema = null ) {
- $old = $this->mSchema;
+ $old = $this->schema;
if ( $schema !== null ) {
- $this->mSchema = $schema;
+ $this->schema = $schema;
}
return $old;
public function getLBInfo( $name = null ) {
if ( is_null( $name ) ) {
- return $this->mLBInfo;
+ return $this->lbInfo;
} else {
- if ( array_key_exists( $name, $this->mLBInfo ) ) {
- return $this->mLBInfo[$name];
+ if ( array_key_exists( $name, $this->lbInfo ) ) {
+ return $this->lbInfo[$name];
} else {
return null;
}
public function setLBInfo( $name, $value = null ) {
if ( is_null( $value ) ) {
- $this->mLBInfo = $name;
+ $this->lbInfo = $name;
} else {
- $this->mLBInfo[$name] = $value;
+ $this->lbInfo[$name] = $value;
}
}
}
public function lastQuery() {
- return $this->mLastQuery;
+ return $this->lastQuery;
}
public function doneWrites() {
- return (bool)$this->mLastWriteTime;
+ return (bool)$this->lastWriteTime;
}
public function lastDoneWrites() {
- return $this->mLastWriteTime ?: false;
+ return $this->lastWriteTime ?: false;
}
public function writesPending() {
- return $this->mTrxLevel && $this->mTrxDoneWrites;
+ return $this->trxLevel && $this->trxDoneWrites;
}
public function writesOrCallbacksPending() {
- return $this->mTrxLevel && (
- $this->mTrxDoneWrites || $this->mTrxIdleCallbacks || $this->mTrxPreCommitCallbacks
+ return $this->trxLevel && (
+ $this->trxDoneWrites || $this->trxIdleCallbacks || $this->trxPreCommitCallbacks
);
}
public function pendingWriteQueryDuration( $type = self::ESTIMATE_TOTAL ) {
- if ( !$this->mTrxLevel ) {
+ if ( !$this->trxLevel ) {
return false;
- } elseif ( !$this->mTrxDoneWrites ) {
+ } elseif ( !$this->trxDoneWrites ) {
return 0.0;
}
switch ( $type ) {
case self::ESTIMATE_DB_APPLY:
$this->ping( $rtt );
- $rttAdjTotal = $this->mTrxWriteAdjQueryCount * $rtt;
- $applyTime = max( $this->mTrxWriteAdjDuration - $rttAdjTotal, 0 );
+ $rttAdjTotal = $this->trxWriteAdjQueryCount * $rtt;
+ $applyTime = max( $this->trxWriteAdjDuration - $rttAdjTotal, 0 );
// For omitted queries, make them count as something at least
- $omitted = $this->mTrxWriteQueryCount - $this->mTrxWriteAdjQueryCount;
+ $omitted = $this->trxWriteQueryCount - $this->trxWriteAdjQueryCount;
$applyTime += self::TINY_WRITE_SEC * $omitted;
return $applyTime;
default: // everything
- return $this->mTrxWriteDuration;
+ return $this->trxWriteDuration;
}
}
public function pendingWriteCallers() {
- return $this->mTrxLevel ? $this->mTrxWriteCallers : [];
+ return $this->trxLevel ? $this->trxWriteCallers : [];
}
public function pendingWriteRowsAffected() {
- return $this->mTrxWriteAffectedRows;
+ return $this->trxWriteAffectedRows;
}
/**
* @return array
*/
protected function pendingWriteAndCallbackCallers() {
- if ( !$this->mTrxLevel ) {
+ if ( !$this->trxLevel ) {
return [];
}
- $fnames = $this->mTrxWriteCallers;
+ $fnames = $this->trxWriteCallers;
foreach ( [
- $this->mTrxIdleCallbacks,
- $this->mTrxPreCommitCallbacks,
- $this->mTrxEndCallbacks
+ $this->trxIdleCallbacks,
+ $this->trxPreCommitCallbacks,
+ $this->trxEndCallbacks
] as $callbacks ) {
foreach ( $callbacks as $callback ) {
$fnames[] = $callback[1];
}
public function isOpen() {
- return $this->mOpened;
+ return $this->opened;
}
public function setFlag( $flag, $remember = self::REMEMBER_NOTHING ) {
}
if ( $remember === self::REMEMBER_PRIOR ) {
- array_push( $this->priorFlags, $this->mFlags );
+ array_push( $this->priorFlags, $this->flags );
}
- $this->mFlags |= $flag;
+ $this->flags |= $flag;
}
public function clearFlag( $flag, $remember = self::REMEMBER_NOTHING ) {
}
if ( $remember === self::REMEMBER_PRIOR ) {
- array_push( $this->priorFlags, $this->mFlags );
+ array_push( $this->priorFlags, $this->flags );
}
- $this->mFlags &= ~$flag;
+ $this->flags &= ~$flag;
}
public function restoreFlags( $state = self::RESTORE_PRIOR ) {
}
if ( $state === self::RESTORE_INITIAL ) {
- $this->mFlags = reset( $this->priorFlags );
+ $this->flags = reset( $this->priorFlags );
$this->priorFlags = [];
} else {
- $this->mFlags = array_pop( $this->priorFlags );
+ $this->flags = array_pop( $this->priorFlags );
}
}
public function getFlag( $flag ) {
- return !!( $this->mFlags & $flag );
+ return !!( $this->flags & $flag );
}
/**
* Set a custom error handler for logging errors during database connection
*/
protected function installErrorHandler() {
- $this->mPHPError = false;
+ $this->phpError = false;
$this->htmlErrors = ini_set( 'html_errors', '0' );
set_error_handler( [ $this, 'connectionErrorLogger' ] );
}
* @return string|bool Last PHP error for this DB (typically connection errors)
*/
protected function getLastPHPError() {
- if ( $this->mPHPError ) {
- $error = preg_replace( '!\[<a.*</a>\]!', '', $this->mPHPError );
+ if ( $this->phpError ) {
+ $error = preg_replace( '!\[<a.*</a>\]!', '', $this->phpError );
$error = preg_replace( '!^.*?:\s?(.*)$!', '$1', $error );
return $error;
* @param string $errstr
*/
public function connectionErrorLogger( $errno, $errstr ) {
- $this->mPHPError = $errstr;
+ $this->phpError = $errstr;
}
/**
protected function getLogContext( array $extras = [] ) {
return array_merge(
[
- 'db_server' => $this->mServer,
- 'db_name' => $this->mDBname,
- 'db_user' => $this->mUser,
+ 'db_server' => $this->server,
+ 'db_name' => $this->dbName,
+ 'db_user' => $this->user,
],
$extras
);
}
public function close() {
- if ( $this->mConn ) {
+ if ( $this->conn ) {
if ( $this->trxLevel() ) {
$this->commit( __METHOD__, self::FLUSHING_INTERNAL );
}
$closed = $this->closeConnection();
- $this->mConn = false;
+ $this->conn = false;
} elseif (
- $this->mTrxIdleCallbacks ||
- $this->mTrxPreCommitCallbacks ||
- $this->mTrxEndCallbacks
+ $this->trxIdleCallbacks ||
+ $this->trxPreCommitCallbacks ||
+ $this->trxEndCallbacks
) { // sanity
throw new RuntimeException( "Transaction callbacks still pending." );
} else {
$closed = true;
}
- $this->mOpened = false;
+ $this->opened = false;
return $closed;
}
$sql,
$matches
) ) {
- $this->mSessionTempTables[$matches[1]] = 1;
+ $this->sessionTempTables[$matches[1]] = 1;
return true;
} elseif ( preg_match(
$sql,
$matches
) ) {
- $isTemp = isset( $this->mSessionTempTables[$matches[1]] );
- unset( $this->mSessionTempTables[$matches[1]] );
+ $isTemp = isset( $this->sessionTempTables[$matches[1]] );
+ unset( $this->sessionTempTables[$matches[1]] );
return $isTemp;
} elseif ( preg_match(
$sql,
$matches
) ) {
- return isset( $this->mSessionTempTables[$matches[1]] );
+ return isset( $this->sessionTempTables[$matches[1]] );
} elseif ( preg_match(
'/^(?:INSERT\s+(?:\w+\s+)?INTO|UPDATE|DELETE\s+FROM)\s+[`"\']?(\w+)[`"\']?/i',
$sql,
$matches
) ) {
- return isset( $this->mSessionTempTables[$matches[1]] );
+ return isset( $this->sessionTempTables[$matches[1]] );
}
return false;
public function query( $sql, $fname = __METHOD__, $tempIgnore = false ) {
$priorWritesPending = $this->writesOrCallbacksPending();
- $this->mLastQuery = $sql;
+ $this->lastQuery = $sql;
$isWrite = $this->isWriteQuery( $sql );
if ( $isWrite ) {
throw new DBReadOnlyError( $this, "Database is read-only: $reason" );
}
# Set a flag indicating that writes have been done
- $this->mLastWriteTime = microtime( true );
+ $this->lastWriteTime = microtime( true );
}
# Add trace comment to the begin of the sql string, right after the operator.
$commentedSql = preg_replace( '/\s|$/', " /* $fname {$this->agent} */ ", $sql, 1 );
# Start implicit transactions that wrap the request if DBO_TRX is enabled
- if ( !$this->mTrxLevel && $this->getFlag( self::DBO_TRX )
+ if ( !$this->trxLevel && $this->getFlag( self::DBO_TRX )
&& $this->isTransactableQuery( $sql )
) {
$this->begin( __METHOD__ . " ($fname)", self::TRANSACTION_INTERNAL );
- $this->mTrxAutomatic = true;
+ $this->trxAutomatic = true;
}
# Keep track of whether the transaction has write queries pending
- if ( $this->mTrxLevel && !$this->mTrxDoneWrites && $isWrite ) {
- $this->mTrxDoneWrites = true;
+ if ( $this->trxLevel && !$this->trxDoneWrites && $isWrite ) {
+ $this->trxDoneWrites = true;
$this->trxProfiler->transactionWritingIn(
- $this->mServer, $this->mDBname, $this->mTrxShortId );
+ $this->server, $this->dbName, $this->trxShortId );
}
if ( $this->getFlag( self::DBO_DEBUG ) ) {
- $this->queryLogger->debug( "{$this->mDBname} {$commentedSql}" );
+ $this->queryLogger->debug( "{$this->dbName} {$commentedSql}" );
}
# Avoid fatals if close() was called
}
# Include query transaction state
- $queryProf .= $this->mTrxShortId ? " [TRX#{$this->mTrxShortId}]" : "";
+ $queryProf .= $this->trxShortId ? " [TRX#{$this->trxShortId}]" : "";
$startTime = microtime( true );
if ( $this->profiler ) {
if ( $ret !== false ) {
$this->lastPing = $startTime;
- if ( $isWrite && $this->mTrxLevel ) {
+ if ( $isWrite && $this->trxLevel ) {
$this->updateTrxWriteQueryTime( $sql, $queryRuntime, $this->affectedRows() );
- $this->mTrxWriteCallers[] = $fname;
+ $this->trxWriteCallers[] = $fname;
}
}
if ( $sql === self::PING_QUERY ) {
- $this->mRTTEstimate = $queryRuntime;
+ $this->rttEstimate = $queryRuntime;
}
$this->trxProfiler->recordQueryCompletion(
}
}
- $this->mTrxWriteDuration += $runtime;
- $this->mTrxWriteQueryCount += 1;
- $this->mTrxWriteAffectedRows += $affected;
+ $this->trxWriteDuration += $runtime;
+ $this->trxWriteQueryCount += 1;
+ $this->trxWriteAffectedRows += $affected;
if ( $indicativeOfReplicaRuntime ) {
- $this->mTrxWriteAdjDuration += $runtime;
- $this->mTrxWriteAdjQueryCount += 1;
+ $this->trxWriteAdjDuration += $runtime;
+ $this->trxWriteAdjQueryCount += 1;
}
}
# Dropped connections also mean that named locks are automatically released.
# Only allow error suppression in autocommit mode or when the lost transaction
# didn't matter anyway (aside from DBO_TRX snapshot loss).
- if ( $this->mNamedLocksHeld ) {
+ if ( $this->namedLocksHeld ) {
return false; // possible critical section violation
} elseif ( $sql === 'COMMIT' ) {
return !$priorWritesPending; // nothing written anyway? (T127428)
* @return null|Exception
*/
private function handleSessionLoss() {
- $this->mTrxLevel = 0;
- $this->mTrxIdleCallbacks = []; // T67263
- $this->mTrxPreCommitCallbacks = []; // T67263
- $this->mSessionTempTables = [];
- $this->mNamedLocksHeld = [];
+ $this->trxLevel = 0;
+ $this->trxIdleCallbacks = []; // T67263
+ $this->trxPreCommitCallbacks = []; // T67263
+ $this->sessionTempTables = [];
+ $this->namedLocksHeld = [];
try {
- // Handle callbacks in mTrxEndCallbacks
+ // Handle callbacks in trxEndCallbacks
$this->runOnTransactionIdleCallbacks( self::TRIGGER_ROLLBACK );
$this->runTransactionListenerCallbacks( self::TRIGGER_ROLLBACK );
return null;
$this->tableNamesWithIndexClauseOrJOIN(
$table, $useIndexes, $ignoreIndexes, $join_conds );
} elseif ( $table != '' ) {
- if ( $table[0] == ' ' ) {
- $from = ' FROM ' . $table;
- } else {
- $from = ' FROM ' .
- $this->tableNamesWithIndexClauseOrJOIN(
- [ $table ], $useIndexes, $ignoreIndexes, [] );
- }
+ $from = ' FROM ' .
+ $this->tableNamesWithIndexClauseOrJOIN(
+ [ $table ], $useIndexes, $ignoreIndexes, [] );
} else {
$from = '';
}
public function tableExists( $table, $fname = __METHOD__ ) {
$tableRaw = $this->tableName( $table, 'raw' );
- if ( isset( $this->mSessionTempTables[$tableRaw] ) ) {
+ if ( isset( $this->sessionTempTables[$tableRaw] ) ) {
return true; // already known to exist
}
# Stub. Shouldn't cause serious problems if it's not overridden, but
# if your database engine supports a concept similar to MySQL's
# databases you may as well.
- $this->mDBname = $db;
+ $this->dbName = $db;
return true;
}
public function getDBname() {
- return $this->mDBname;
+ return $this->dbName;
}
public function getServer() {
- return $this->mServer;
+ return $this->server;
}
public function tableName( $name, $format = 'quoted' ) {
$database = $this->tableAliases[$table]['dbname'];
$schema = is_string( $this->tableAliases[$table]['schema'] )
? $this->tableAliases[$table]['schema']
- : $this->mSchema;
+ : $this->schema;
$prefix = is_string( $this->tableAliases[$table]['prefix'] )
? $this->tableAliases[$table]['prefix']
- : $this->mTablePrefix;
+ : $this->tablePrefix;
} else {
$database = '';
- $schema = $this->mSchema; # Default schema
- $prefix = $this->mTablePrefix; # Default prefix
+ $schema = $this->schema; # Default schema
+ $prefix = $this->tablePrefix; # Default prefix
}
}
}
$affectedRowCount = 0;
- $useTrx = !$this->mTrxLevel;
+ $useTrx = !$this->trxLevel;
if ( $useTrx ) {
$this->begin( $fname, self::TRANSACTION_INTERNAL );
}
}
final public function onTransactionResolution( callable $callback, $fname = __METHOD__ ) {
- if ( !$this->mTrxLevel ) {
+ if ( !$this->trxLevel ) {
throw new DBUnexpectedError( $this, "No transaction is active." );
}
- $this->mTrxEndCallbacks[] = [ $callback, $fname ];
+ $this->trxEndCallbacks[] = [ $callback, $fname ];
}
final public function onTransactionIdle( callable $callback, $fname = __METHOD__ ) {
- $this->mTrxIdleCallbacks[] = [ $callback, $fname ];
- if ( !$this->mTrxLevel ) {
+ $this->trxIdleCallbacks[] = [ $callback, $fname ];
+ if ( !$this->trxLevel ) {
$this->runOnTransactionIdleCallbacks( self::TRIGGER_IDLE );
}
}
final public function onTransactionPreCommitOrIdle( callable $callback, $fname = __METHOD__ ) {
- if ( $this->mTrxLevel || $this->getFlag( self::DBO_TRX ) ) {
+ if ( $this->trxLevel || $this->getFlag( self::DBO_TRX ) ) {
// As long as DBO_TRX is set, writes will accumulate until the load balancer issues
// an implicit commit of all peer databases. This is true even if a transaction has
// not yet been triggered by writes; make sure $callback runs *after* any such writes.
- $this->mTrxPreCommitCallbacks[] = [ $callback, $fname ];
+ $this->trxPreCommitCallbacks[] = [ $callback, $fname ];
} else {
// No transaction is active nor will start implicitly, so make one for this callback
$this->startAtomic( __METHOD__ );
final public function setTransactionListener( $name, callable $callback = null ) {
if ( $callback ) {
- $this->mTrxRecurringCallbacks[$name] = $callback;
+ $this->trxRecurringCallbacks[$name] = $callback;
} else {
- unset( $this->mTrxRecurringCallbacks[$name] );
+ unset( $this->trxRecurringCallbacks[$name] );
}
}
* @since 1.28
*/
final public function setTrxEndCallbackSuppression( $suppress ) {
- $this->mTrxEndCallbacksSuppressed = $suppress;
+ $this->trxEndCallbacksSuppressed = $suppress;
}
/**
* @throws Exception
*/
public function runOnTransactionIdleCallbacks( $trigger ) {
- if ( $this->mTrxEndCallbacksSuppressed ) {
+ if ( $this->trxEndCallbacksSuppressed ) {
return;
}
$e = null; // first exception
do { // callbacks may add callbacks :)
$callbacks = array_merge(
- $this->mTrxIdleCallbacks,
- $this->mTrxEndCallbacks // include "transaction resolution" callbacks
+ $this->trxIdleCallbacks,
+ $this->trxEndCallbacks // include "transaction resolution" callbacks
);
- $this->mTrxIdleCallbacks = []; // consumed (and recursion guard)
- $this->mTrxEndCallbacks = []; // consumed (recursion guard)
+ $this->trxIdleCallbacks = []; // consumed (and recursion guard)
+ $this->trxEndCallbacks = []; // consumed (recursion guard)
foreach ( $callbacks as $callback ) {
try {
list( $phpCallback ) = $callback;
}
}
}
- } while ( count( $this->mTrxIdleCallbacks ) );
+ } while ( count( $this->trxIdleCallbacks ) );
if ( $e instanceof Exception ) {
throw $e; // re-throw any first exception
public function runOnTransactionPreCommitCallbacks() {
$e = null; // first exception
do { // callbacks may add callbacks :)
- $callbacks = $this->mTrxPreCommitCallbacks;
- $this->mTrxPreCommitCallbacks = []; // consumed (and recursion guard)
+ $callbacks = $this->trxPreCommitCallbacks;
+ $this->trxPreCommitCallbacks = []; // consumed (and recursion guard)
foreach ( $callbacks as $callback ) {
try {
list( $phpCallback ) = $callback;
$e = $e ?: $ex;
}
}
- } while ( count( $this->mTrxPreCommitCallbacks ) );
+ } while ( count( $this->trxPreCommitCallbacks ) );
if ( $e instanceof Exception ) {
throw $e; // re-throw any first exception
* @since 1.20
*/
public function runTransactionListenerCallbacks( $trigger ) {
- if ( $this->mTrxEndCallbacksSuppressed ) {
+ if ( $this->trxEndCallbacksSuppressed ) {
return;
}
/** @var Exception $e */
$e = null; // first exception
- foreach ( $this->mTrxRecurringCallbacks as $phpCallback ) {
+ foreach ( $this->trxRecurringCallbacks as $phpCallback ) {
try {
$phpCallback( $trigger, $this );
} catch ( Exception $ex ) {
}
final public function startAtomic( $fname = __METHOD__ ) {
- if ( !$this->mTrxLevel ) {
+ if ( !$this->trxLevel ) {
$this->begin( $fname, self::TRANSACTION_INTERNAL );
// If DBO_TRX is set, a series of startAtomic/endAtomic pairs will result
// in all changes being in one transaction to keep requests transactional.
if ( !$this->getFlag( self::DBO_TRX ) ) {
- $this->mTrxAutomaticAtomic = true;
+ $this->trxAutomaticAtomic = true;
}
}
- $this->mTrxAtomicLevels[] = $fname;
+ $this->trxAtomicLevels[] = $fname;
}
final public function endAtomic( $fname = __METHOD__ ) {
- if ( !$this->mTrxLevel ) {
+ if ( !$this->trxLevel ) {
throw new DBUnexpectedError( $this, "No atomic transaction is open (got $fname)." );
}
- if ( !$this->mTrxAtomicLevels ||
- array_pop( $this->mTrxAtomicLevels ) !== $fname
+ if ( !$this->trxAtomicLevels ||
+ array_pop( $this->trxAtomicLevels ) !== $fname
) {
throw new DBUnexpectedError( $this, "Invalid atomic section ended (got $fname)." );
}
- if ( !$this->mTrxAtomicLevels && $this->mTrxAutomaticAtomic ) {
+ if ( !$this->trxAtomicLevels && $this->trxAutomaticAtomic ) {
$this->commit( $fname, self::FLUSHING_INTERNAL );
}
}
final public function begin( $fname = __METHOD__, $mode = self::TRANSACTION_EXPLICIT ) {
// Protect against mismatched atomic section, transaction nesting, and snapshot loss
- if ( $this->mTrxLevel ) {
- if ( $this->mTrxAtomicLevels ) {
- $levels = implode( ', ', $this->mTrxAtomicLevels );
+ if ( $this->trxLevel ) {
+ if ( $this->trxAtomicLevels ) {
+ $levels = implode( ', ', $this->trxAtomicLevels );
$msg = "$fname: Got explicit BEGIN while atomic section(s) $levels are open.";
throw new DBUnexpectedError( $this, $msg );
- } elseif ( !$this->mTrxAutomatic ) {
- $msg = "$fname: Explicit transaction already active (from {$this->mTrxFname}).";
+ } elseif ( !$this->trxAutomatic ) {
+ $msg = "$fname: Explicit transaction already active (from {$this->trxFname}).";
throw new DBUnexpectedError( $this, $msg );
} else {
// @TODO: make this an exception at some point
- $msg = "$fname: Implicit transaction already active (from {$this->mTrxFname}).";
+ $msg = "$fname: Implicit transaction already active (from {$this->trxFname}).";
$this->queryLogger->error( $msg );
return; // join the main transaction set
}
$this->assertOpen();
$this->doBegin( $fname );
- $this->mTrxTimestamp = microtime( true );
- $this->mTrxFname = $fname;
- $this->mTrxDoneWrites = false;
- $this->mTrxAutomaticAtomic = false;
- $this->mTrxAtomicLevels = [];
- $this->mTrxShortId = sprintf( '%06x', mt_rand( 0, 0xffffff ) );
- $this->mTrxWriteDuration = 0.0;
- $this->mTrxWriteQueryCount = 0;
- $this->mTrxWriteAffectedRows = 0;
- $this->mTrxWriteAdjDuration = 0.0;
- $this->mTrxWriteAdjQueryCount = 0;
- $this->mTrxWriteCallers = [];
+ $this->trxTimestamp = microtime( true );
+ $this->trxFname = $fname;
+ $this->trxDoneWrites = false;
+ $this->trxAutomaticAtomic = false;
+ $this->trxAtomicLevels = [];
+ $this->trxShortId = sprintf( '%06x', mt_rand( 0, 0xffffff ) );
+ $this->trxWriteDuration = 0.0;
+ $this->trxWriteQueryCount = 0;
+ $this->trxWriteAffectedRows = 0;
+ $this->trxWriteAdjDuration = 0.0;
+ $this->trxWriteAdjQueryCount = 0;
+ $this->trxWriteCallers = [];
// First SELECT after BEGIN will establish the snapshot in REPEATABLE-READ.
// Get an estimate of the replica DB lag before then, treating estimate staleness
// as lag itself just to be safe
$status = $this->getApproximateLagStatus();
- $this->mTrxReplicaLag = $status['lag'] + ( microtime( true ) - $status['since'] );
+ $this->trxReplicaLag = $status['lag'] + ( microtime( true ) - $status['since'] );
// T147697: make explicitTrxActive() return true until begin() finishes. This way, no
// caller will think its OK to muck around with the transaction just because startAtomic()
- // has not yet completed (e.g. setting mTrxAtomicLevels).
- $this->mTrxAutomatic = ( $mode === self::TRANSACTION_INTERNAL );
+ // has not yet completed (e.g. setting trxAtomicLevels).
+ $this->trxAutomatic = ( $mode === self::TRANSACTION_INTERNAL );
}
/**
*/
protected function doBegin( $fname ) {
$this->query( 'BEGIN', $fname );
- $this->mTrxLevel = 1;
+ $this->trxLevel = 1;
}
final public function commit( $fname = __METHOD__, $flush = '' ) {
- if ( $this->mTrxLevel && $this->mTrxAtomicLevels ) {
+ if ( $this->trxLevel && $this->trxAtomicLevels ) {
// There are still atomic sections open. This cannot be ignored
- $levels = implode( ', ', $this->mTrxAtomicLevels );
+ $levels = implode( ', ', $this->trxAtomicLevels );
throw new DBUnexpectedError(
$this,
"$fname: Got COMMIT while atomic sections $levels are still open."
}
if ( $flush === self::FLUSHING_INTERNAL || $flush === self::FLUSHING_ALL_PEERS ) {
- if ( !$this->mTrxLevel ) {
+ if ( !$this->trxLevel ) {
return; // nothing to do
- } elseif ( !$this->mTrxAutomatic ) {
+ } elseif ( !$this->trxAutomatic ) {
throw new DBUnexpectedError(
$this,
"$fname: Flushing an explicit transaction, getting out of sync."
);
}
} else {
- if ( !$this->mTrxLevel ) {
+ if ( !$this->trxLevel ) {
$this->queryLogger->error(
"$fname: No transaction to commit, something got out of sync." );
return; // nothing to do
- } elseif ( $this->mTrxAutomatic ) {
+ } elseif ( $this->trxAutomatic ) {
// @TODO: make this an exception at some point
$msg = "$fname: Explicit commit of implicit transaction.";
$this->queryLogger->error( $msg );
$this->runOnTransactionPreCommitCallbacks();
$writeTime = $this->pendingWriteQueryDuration( self::ESTIMATE_DB_APPLY );
$this->doCommit( $fname );
- if ( $this->mTrxDoneWrites ) {
- $this->mLastWriteTime = microtime( true );
+ if ( $this->trxDoneWrites ) {
+ $this->lastWriteTime = microtime( true );
$this->trxProfiler->transactionWritingOut(
- $this->mServer,
- $this->mDBname,
- $this->mTrxShortId,
+ $this->server,
+ $this->dbName,
+ $this->trxShortId,
$writeTime,
- $this->mTrxWriteAffectedRows
+ $this->trxWriteAffectedRows
);
}
* @param string $fname
*/
protected function doCommit( $fname ) {
- if ( $this->mTrxLevel ) {
+ if ( $this->trxLevel ) {
$this->query( 'COMMIT', $fname );
- $this->mTrxLevel = 0;
+ $this->trxLevel = 0;
}
}
final public function rollback( $fname = __METHOD__, $flush = '' ) {
if ( $flush === self::FLUSHING_INTERNAL || $flush === self::FLUSHING_ALL_PEERS ) {
- if ( !$this->mTrxLevel ) {
+ if ( !$this->trxLevel ) {
return; // nothing to do
}
} else {
- if ( !$this->mTrxLevel ) {
+ if ( !$this->trxLevel ) {
$this->queryLogger->error(
"$fname: No transaction to rollback, something got out of sync." );
return; // nothing to do
$this->assertOpen();
$this->doRollback( $fname );
- $this->mTrxAtomicLevels = [];
- if ( $this->mTrxDoneWrites ) {
+ $this->trxAtomicLevels = [];
+ if ( $this->trxDoneWrites ) {
$this->trxProfiler->transactionWritingOut(
- $this->mServer,
- $this->mDBname,
- $this->mTrxShortId
+ $this->server,
+ $this->dbName,
+ $this->trxShortId
);
}
- $this->mTrxIdleCallbacks = []; // clear
- $this->mTrxPreCommitCallbacks = []; // clear
+ $this->trxIdleCallbacks = []; // clear
+ $this->trxPreCommitCallbacks = []; // clear
try {
$this->runOnTransactionIdleCallbacks( self::TRIGGER_ROLLBACK );
} catch ( Exception $e ) {
* @param string $fname
*/
protected function doRollback( $fname ) {
- if ( $this->mTrxLevel ) {
+ if ( $this->trxLevel ) {
# Disconnects cause rollback anyway, so ignore those errors
$ignoreErrors = true;
$this->query( 'ROLLBACK', $fname, $ignoreErrors );
- $this->mTrxLevel = 0;
+ $this->trxLevel = 0;
}
}
}
public function explicitTrxActive() {
- return $this->mTrxLevel && ( $this->mTrxAtomicLevels || !$this->mTrxAutomatic );
+ return $this->trxLevel && ( $this->trxAtomicLevels || !$this->trxAutomatic );
}
public function duplicateTableStructure(
public function ping( &$rtt = null ) {
// Avoid hitting the server if it was hit recently
if ( $this->isOpen() && ( microtime( true ) - $this->lastPing ) < self::PING_TTL ) {
- if ( !func_num_args() || $this->mRTTEstimate > 0 ) {
- $rtt = $this->mRTTEstimate;
+ if ( !func_num_args() || $this->rttEstimate > 0 ) {
+ $rtt = $this->rttEstimate;
return true; // don't care about $rtt
}
}
$this->restoreFlags( self::RESTORE_PRIOR );
if ( $ok ) {
- $rtt = $this->mRTTEstimate;
+ $rtt = $this->rttEstimate;
}
return $ok;
*/
protected function reconnect() {
$this->closeConnection();
- $this->mOpened = false;
- $this->mConn = false;
+ $this->opened = false;
+ $this->conn = false;
try {
- $this->open( $this->mServer, $this->mUser, $this->mPassword, $this->mDBname );
+ $this->open( $this->server, $this->user, $this->password, $this->dbName );
$this->lastPing = microtime( true );
$ok = true;
} catch ( DBConnectionError $e ) {
* @since 1.27
*/
protected function getTransactionLagStatus() {
- return $this->mTrxLevel
- ? [ 'lag' => $this->mTrxReplicaLag, 'since' => $this->trxTimestamp() ]
+ return $this->trxLevel
+ ? [ 'lag' => $this->trxReplicaLag, 'since' => $this->trxTimestamp() ]
: null;
}
}
public function setSchemaVars( $vars ) {
- $this->mSchemaVars = $vars;
+ $this->schemaVars = $vars;
}
public function sourceStream(
* @return array
*/
protected function getSchemaVars() {
- if ( $this->mSchemaVars ) {
- return $this->mSchemaVars;
+ if ( $this->schemaVars ) {
+ return $this->schemaVars;
} else {
return $this->getDefaultSchemaVars();
}
}
public function lockIsFree( $lockName, $method ) {
- return true;
+ // RDBMs methods for checking named locks may or may not count this thread itself.
+ // In MySQL, IS_FREE_LOCK() returns 0 if the thread already has the lock. This is
+ // the behavior choosen by the interface for this method.
+ return !isset( $this->namedLocksHeld[$lockName] );
}
public function lock( $lockName, $method, $timeout = 5 ) {
- $this->mNamedLocksHeld[$lockName] = 1;
+ $this->namedLocksHeld[$lockName] = 1;
return true;
}
public function unlock( $lockName, $method ) {
- unset( $this->mNamedLocksHeld[$lockName] );
+ unset( $this->namedLocksHeld[$lockName] );
return true;
}
}
/**
- * Get the underlying binding handle, mConn
+ * Get the underlying binding connection handle
*
- * Makes sure that mConn is set (disconnects and ping() failure can unset it).
+ * Makes sure the connection resource is set (disconnects and ping() failure can unset it).
* This catches broken callers than catch and ignore disconnection exceptions.
* Unlike checking isOpen(), this is safe to call inside of open().
*
* @since 1.26
*/
protected function getBindingHandle() {
- if ( !$this->mConn ) {
+ if ( !$this->conn ) {
throw new DBUnexpectedError(
$this,
'DB connection was already closed or the connection dropped.'
);
}
- return $this->mConn;
+ return $this->conn;
}
/**
* @return string
*/
public function __toString() {
- return (string)$this->mConn;
+ return (string)$this->conn;
}
/**
if ( $this->isOpen() ) {
// Open a new connection resource without messing with the old one
- $this->mOpened = false;
- $this->mConn = false;
- $this->mTrxEndCallbacks = []; // don't copy
+ $this->opened = false;
+ $this->conn = false;
+ $this->trxEndCallbacks = []; // don't copy
$this->handleSessionLoss(); // no trx or locks anymore
- $this->open( $this->mServer, $this->mUser, $this->mPassword, $this->mDBname );
+ $this->open( $this->server, $this->user, $this->password, $this->dbName );
$this->lastPing = microtime( true );
}
}
* Run a few simple sanity checks and close dangling connections
*/
public function __destruct() {
- if ( $this->mTrxLevel && $this->mTrxDoneWrites ) {
- trigger_error( "Uncommitted DB writes (transaction from {$this->mTrxFname})." );
+ if ( $this->trxLevel && $this->trxDoneWrites ) {
+ trigger_error( "Uncommitted DB writes (transaction from {$this->trxFname})." );
}
$danglingWriters = $this->pendingWriteAndCallbackCallers();
trigger_error( "DB transaction writes or callbacks still pending ($fnames)." );
}
- if ( $this->mConn ) {
+ if ( $this->conn ) {
// Avoid connection leaks for sanity. Normally, resources close at script completion.
// The connection might already be closed in zend/hhvm by now, so suppress warnings.
Wikimedia\suppressWarnings();
$this->closeConnection();
Wikimedia\restoreWarnings();
- $this->mConn = false;
- $this->mOpened = false;
+ $this->conn = false;
+ $this->opened = false;
}
}
}
}
$this->close();
- $this->mServer = $server;
- $this->mUser = $user;
- $this->mPassword = $password;
- $this->mDBname = $dbName;
+ $this->server = $server;
+ $this->user = $user;
+ $this->password = $password;
+ $this->dbName = $dbName;
$connectionInfo = [];
}
Wikimedia\suppressWarnings();
- $this->mConn = sqlsrv_connect( $server, $connectionInfo );
+ $this->conn = sqlsrv_connect( $server, $connectionInfo );
Wikimedia\restoreWarnings();
- if ( $this->mConn === false ) {
+ if ( $this->conn === false ) {
throw new DBConnectionError( $this, $this->lastError() );
}
- $this->mOpened = true;
+ $this->opened = true;
- return $this->mConn;
+ return $this->conn;
}
/**
* @return bool
*/
protected function closeConnection() {
- return sqlsrv_close( $this->mConn );
+ return sqlsrv_close( $this->conn );
}
/**
if ( $this->mPrepareStatements ) {
// we do prepare + execute so we can get its field metadata for later usage if desired
- $stmt = sqlsrv_prepare( $this->mConn, $sql, [], $scrollArr );
+ $stmt = sqlsrv_prepare( $this->conn, $sql, [], $scrollArr );
$success = sqlsrv_execute( $stmt );
} else {
- $stmt = sqlsrv_query( $this->mConn, $sql, [], $scrollArr );
+ $stmt = sqlsrv_query( $this->conn, $sql, [], $scrollArr );
$success = (bool)$stmt;
}
* @return string Version information from the database
*/
public function getServerVersion() {
- $server_info = sqlsrv_server_info( $this->mConn );
+ $server_info = sqlsrv_server_info( $this->conn );
$version = 'Error';
if ( isset( $server_info['SQLServerVersion'] ) ) {
$version = $server_info['SQLServerVersion'];
}
if ( $schema === false ) {
- $schema = $this->mSchema;
+ $schema = $this->schema;
}
$res = $this->query( "SELECT 1 FROM INFORMATION_SCHEMA.TABLES
* @param string $fname
*/
protected function doBegin( $fname = __METHOD__ ) {
- sqlsrv_begin_transaction( $this->mConn );
- $this->mTrxLevel = 1;
+ sqlsrv_begin_transaction( $this->conn );
+ $this->trxLevel = 1;
}
/**
* @param string $fname
*/
protected function doCommit( $fname = __METHOD__ ) {
- sqlsrv_commit( $this->mConn );
- $this->mTrxLevel = 0;
+ sqlsrv_commit( $this->conn );
+ $this->trxLevel = 0;
}
/**
* @param string $fname
*/
protected function doRollback( $fname = __METHOD__ ) {
- sqlsrv_rollback( $this->mConn );
- $this->mTrxLevel = 0;
+ sqlsrv_rollback( $this->conn );
+ $this->trxLevel = 0;
}
/**
*/
public function selectDB( $db ) {
try {
- $this->mDBname = $db;
+ $this->dbName = $db;
$this->query( "USE $db" );
return true;
} catch ( Exception $e ) {
private function populateColumnCaches() {
$res = $this->select( 'INFORMATION_SCHEMA.COLUMNS', '*',
[
- 'TABLE_CATALOG' => $this->mDBname,
- 'TABLE_SCHEMA' => $this->mSchema,
+ 'TABLE_CATALOG' => $this->dbName,
+ 'TABLE_SCHEMA' => $this->schema,
'DATA_TYPE' => [ 'varbinary', 'binary', 'image', 'bit' ]
] );
protected $sqlMode;
/** @var bool Use experimental UTF-8 transmission encoding */
protected $utf8Mode;
+ /** @var bool|null */
+ protected $defaultBigSelects = null;
/** @var string|null */
private $serverVersion = null;
# Close/unset connection handle
$this->close();
- $this->mServer = $server;
- $this->mUser = $user;
- $this->mPassword = $password;
- $this->mDBname = $dbName;
+ $this->server = $server;
+ $this->user = $user;
+ $this->password = $password;
+ $this->dbName = $dbName;
$this->installErrorHandler();
try {
- $this->mConn = $this->mysqlConnect( $this->mServer );
+ $this->conn = $this->mysqlConnect( $this->server );
} catch ( Exception $ex ) {
$this->restoreErrorHandler();
throw $ex;
$error = $this->restoreErrorHandler();
# Always log connection errors
- if ( !$this->mConn ) {
+ if ( !$this->conn ) {
if ( !$error ) {
$error = $this->lastError();
}
] )
);
$this->queryLogger->debug(
- "Error selecting database $dbName on server {$this->mServer}" );
+ "Error selecting database $dbName on server {$this->server}" );
$this->reportConnectionError( "Error selecting database $dbName" );
}
}
// Set any custom settings defined by site config
// (e.g. https://dev.mysql.com/doc/refman/4.1/en/innodb-parameters.html)
- foreach ( $this->mSessionVars as $var => $val ) {
+ foreach ( $this->sessionVars as $var => $val ) {
// Escape strings but not numbers to avoid MySQL complaining
if ( !is_int( $val ) && !is_float( $val ) ) {
$val = $this->addQuotes( $val );
}
}
- $this->mOpened = true;
+ $this->opened = true;
return true;
}
* @return string
*/
public function lastError() {
- if ( $this->mConn ) {
+ if ( $this->conn ) {
# Even if it's non-zero, it can still be invalid
Wikimedia\suppressWarnings();
- $error = $this->mysqlError( $this->mConn );
+ $error = $this->mysqlError( $this->conn );
if ( !$error ) {
$error = $this->mysqlError();
}
$error = $this->mysqlError();
}
if ( $error ) {
- $error .= ' (' . $this->mServer . ')';
+ $error .= ' (' . $this->server . ')';
}
return $error;
list( $database, , $prefix, $table ) = $this->qualifiedTableComponents( $table );
$tableName = "{$prefix}{$table}";
- if ( isset( $this->mSessionTempTables[$tableName] ) ) {
+ if ( isset( $this->sessionTempTables[$tableName] ) ) {
return true; // already known to exist and won't show in SHOW TABLES anyway
}
* @since 1.20
*/
public function lockIsFree( $lockName, $method ) {
+ if ( !parent::lockIsFree( $lockName, $method ) ) {
+ return false; // already held
+ }
+
$encName = $this->addQuotes( $this->makeLockName( $lockName ) );
$result = $this->query( "SELECT IS_FREE_LOCK($encName) AS lockstatus", $method );
$row = $this->fetchObject( $result );
*/
public function setBigSelects( $value = true ) {
if ( $value === 'default' ) {
- if ( $this->mDefaultBigSelects === null ) {
+ if ( $this->defaultBigSelects === null ) {
# Function hasn't been called before so it must already be set to the default
return;
} else {
- $value = $this->mDefaultBigSelects;
+ $value = $this->defaultBigSelects;
}
- } elseif ( $this->mDefaultBigSelects === null ) {
- $this->mDefaultBigSelects =
+ } elseif ( $this->defaultBigSelects === null ) {
+ $this->defaultBigSelects =
(bool)$this->selectField( false, '@@sql_big_selects', '', __METHOD__ );
}
$encValue = $value ? '1' : '0';
*/
public function listViews( $prefix = null, $fname = __METHOD__ ) {
// The name of the column containing the name of the VIEW
- $propertyName = 'Tables_in_' . $this->mDBname;
+ $propertyName = 'Tables_in_' . $this->dbName;
// Query for the VIEWS
$res = $this->query( 'SHOW FULL TABLES WHERE TABLE_TYPE = "VIEW"' );
return $index;
}
}
+
+ protected function isTransactableQuery( $sql ) {
+ return parent::isTransactableQuery( $sql ) &&
+ !preg_match( '/^SELECT\s+(GET|RELEASE|IS_FREE)_LOCK\(/', $sql );
+ }
}
class_alias( DatabaseMysqlBase::class, 'DatabaseMysqlBase' );
$mysqli = mysqli_init();
$connFlags = 0;
- if ( $this->mFlags & self::DBO_SSL ) {
+ if ( $this->flags & self::DBO_SSL ) {
$connFlags |= MYSQLI_CLIENT_SSL;
$mysqli->ssl_set(
$this->sslKeyPath,
$this->sslCiphers
);
}
- if ( $this->mFlags & self::DBO_COMPRESS ) {
+ if ( $this->flags & self::DBO_COMPRESS ) {
$connFlags |= MYSQLI_CLIENT_COMPRESS;
}
- if ( $this->mFlags & self::DBO_PERSISTENT ) {
+ if ( $this->flags & self::DBO_PERSISTENT ) {
$realServer = 'p:' . $realServer;
}
}
$mysqli->options( MYSQLI_OPT_CONNECT_TIMEOUT, 3 );
- if ( $mysqli->real_connect( $realServer, $this->mUser,
- $this->mPassword, $this->mDBname, $port, $socket, $connFlags )
+ if ( $mysqli->real_connect( $realServer, $this->user,
+ $this->password, $this->dbName, $port, $socket, $connFlags )
) {
return $mysqli;
}
* @return int
*/
function lastErrno() {
- if ( $this->mConn ) {
- return $this->mConn->errno;
+ if ( $this->conn ) {
+ return $this->conn->errno;
} else {
return mysqli_connect_errno();
}
function selectDB( $db ) {
$conn = $this->getBindingHandle();
- $this->mDBname = $db;
+ $this->dbName = $db;
return $conn->select_db( $db );
}
* @return string
*/
public function __toString() {
- if ( $this->mConn instanceof mysqli ) {
- return (string)$this->mConn->thread_id;
+ if ( $this->conn instanceof mysqli ) {
+ return (string)$this->conn->thread_id;
} else {
// mConn might be false or something.
- return (string)$this->mConn;
+ return (string)$this->conn;
}
}
}
);
}
- $this->mServer = $server;
- $this->mUser = $user;
- $this->mPassword = $password;
- $this->mDBname = $dbName;
+ $this->server = $server;
+ $this->user = $user;
+ $this->password = $password;
+ $this->dbName = $dbName;
$connectVars = [
// pg_connect() user $user as the default database. Since a database is *required*,
if ( (int)$this->port > 0 ) {
$connectVars['port'] = (int)$this->port;
}
- if ( $this->mFlags & self::DBO_SSL ) {
+ if ( $this->flags & self::DBO_SSL ) {
$connectVars['sslmode'] = 1;
}
try {
// Use new connections to let LoadBalancer/LBFactory handle reuse
- $this->mConn = pg_connect( $this->connectString, PGSQL_CONNECT_FORCE_NEW );
+ $this->conn = pg_connect( $this->connectString, PGSQL_CONNECT_FORCE_NEW );
} catch ( Exception $ex ) {
$this->restoreErrorHandler();
throw $ex;
$phpError = $this->restoreErrorHandler();
- if ( !$this->mConn ) {
+ if ( !$this->conn ) {
$this->queryLogger->debug(
"DB connection error\n" .
"Server: $server, Database: $dbName, User: $user, Password: " .
throw new DBConnectionError( $this, str_replace( "\n", ' ', $phpError ) );
}
- $this->mOpened = true;
+ $this->opened = true;
# If called from the command-line (e.g. importDump), only show errors
if ( $this->cliMode ) {
$this->query( "SET bytea_output = 'escape'", __METHOD__ ); // PHP bug 53127
}
- $this->determineCoreSchema( $this->mSchema );
+ $this->determineCoreSchema( $this->schema );
// The schema to be used is now in the search path; no need for explicit qualification
- $this->mSchema = '';
+ $this->schema = '';
- return $this->mConn;
+ return $this->conn;
}
public function databasesAreIndependent() {
* @throws DBUnexpectedError
*/
public function selectDB( $db ) {
- if ( $this->mDBname !== $db ) {
- return (bool)$this->open( $this->mServer, $this->mUser, $this->mPassword, $db );
+ if ( $this->dbName !== $db ) {
+ return (bool)$this->open( $this->server, $this->user, $this->password, $db );
} else {
return true;
}
}
protected function closeConnection() {
- return $this->mConn ? pg_close( $this->mConn ) : true;
+ return $this->conn ? pg_close( $this->conn ) : true;
+ }
+
+ protected function isTransactableQuery( $sql ) {
+ return parent::isTransactableQuery( $sql ) &&
+ !preg_match( '/^SELECT\s+pg_(try_|)advisory_\w+\(/', $sql );
}
public function doQuery( $sql ) {
}
}
/* Transaction stays in the ERROR state until rolled back */
- if ( $this->mTrxLevel ) {
+ if ( $this->trxLevel ) {
// Throw away the transaction state, then raise the error as normal.
// Note that if this connection is managed by LBFactory, it's already expected
// that the other transactions LBFactory manages will be rolled back.
}
public function lastError() {
- if ( $this->mConn ) {
+ if ( $this->conn ) {
if ( $this->mLastResult ) {
return pg_result_error( $this->mLastResult );
} else {
}
public function getDBname() {
- return $this->mDBname;
+ return $this->dbName;
}
public function getServer() {
- return $this->mServer;
+ return $this->server;
}
public function buildConcat( $stringList ) {
}
public function lockIsFree( $lockName, $method ) {
+ if ( !parent::lockIsFree( $lockName, $method ) ) {
+ return false; // already held
+ }
// http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
$key = $this->addQuotes( $this->bigintFromLockName( $lockName ) );
$result = $this->query( "SELECT (CASE(pg_try_advisory_lock($key))
protected $mLastResult;
/** @var PDO */
- protected $mConn;
+ protected $conn;
/** @var FSLockManager (hopefully on the same server as the DB) */
protected $lockMgr;
throw new InvalidArgumentException( "Need 'dbDirectory' or 'dbFilePath' parameter." );
} else {
$this->dbDir = $p['dbDirectory'];
- $this->mDBname = $p['dbname'];
- $lockDomain = $this->mDBname;
+ $this->dbName = $p['dbname'];
+ $lockDomain = $this->dbName;
// Stock wiki mode using standard file names per DB.
parent::__construct( $p );
// Super doesn't open when $user is false, but we can work with $dbName
$this->close();
$fileName = self::generateFileName( $this->dbDir, $dbName );
if ( !is_readable( $fileName ) ) {
- $this->mConn = false;
+ $this->conn = false;
throw new DBConnectionError( $this, "SQLite database not accessible" );
}
$this->openFile( $fileName );
- return (bool)$this->mConn;
+ return (bool)$this->conn;
}
/**
$this->dbPath = $fileName;
try {
- if ( $this->mFlags & self::DBO_PERSISTENT ) {
- $this->mConn = new PDO( "sqlite:$fileName", '', '',
+ if ( $this->flags & self::DBO_PERSISTENT ) {
+ $this->conn = new PDO( "sqlite:$fileName", '', '',
[ PDO::ATTR_PERSISTENT => true ] );
} else {
- $this->mConn = new PDO( "sqlite:$fileName", '', '' );
+ $this->conn = new PDO( "sqlite:$fileName", '', '' );
}
} catch ( PDOException $e ) {
$err = $e->getMessage();
}
- if ( !$this->mConn ) {
+ if ( !$this->conn ) {
$this->queryLogger->debug( "DB connection error: $err\n" );
throw new DBConnectionError( $this, $err );
}
- $this->mOpened = !!$this->mConn;
- if ( $this->mOpened ) {
+ $this->opened = !!$this->conn;
+ if ( $this->opened ) {
# Set error codes only, don't raise exceptions
- $this->mConn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
+ $this->conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
# Enforce LIKE to be case sensitive, just like MySQL
$this->query( 'PRAGMA case_sensitive_like = 1' );
- return $this->mConn;
+ return $this->conn;
}
return false;
* @return bool
*/
protected function closeConnection() {
- $this->mConn = null;
+ $this->conn = null;
return true;
}
* @return bool|ResultWrapper
*/
protected function doQuery( $sql ) {
- $res = $this->mConn->query( $sql );
+ $res = $this->conn->query( $sql );
if ( $res === false ) {
return false;
}
*/
function insertId() {
// PDO::lastInsertId yields a string :(
- return intval( $this->mConn->lastInsertId() );
+ return intval( $this->conn->lastInsertId() );
}
/**
* @return string
*/
function lastError() {
- if ( !is_object( $this->mConn ) ) {
+ if ( !is_object( $this->conn ) ) {
return "Cannot return last error, no db connection";
}
- $e = $this->mConn->errorInfo();
+ $e = $this->conn->errorInfo();
return isset( $e[2] ) ? $e[2] : '';
}
* @return string
*/
function lastErrno() {
- if ( !is_object( $this->mConn ) ) {
+ if ( !is_object( $this->conn ) ) {
return "Cannot return last error, no db connection";
} else {
- $info = $this->mConn->errorInfo();
+ $info = $this->conn->errorInfo();
return $info[1];
}
* @return string Version information from the database
*/
function getServerVersion() {
- $ver = $this->mConn->getAttribute( PDO::ATTR_SERVER_VERSION );
+ $ver = $this->conn->getAttribute( PDO::ATTR_SERVER_VERSION );
return $ver;
}
} else {
$this->query( 'BEGIN', $fname );
}
- $this->mTrxLevel = 1;
+ $this->trxLevel = 1;
}
/**
);
return "x'" . bin2hex( (string)$s ) . "'";
} else {
- return $this->mConn->quote( (string)$s );
+ return $this->conn->quote( (string)$s );
}
}
* @return string
*/
public function __toString() {
- return 'SQLite ' . (string)$this->mConn->getAttribute( PDO::ATTR_SERVER_VERSION );
+ return 'SQLite ' . (string)$this->conn->getAttribute( PDO::ATTR_SERVER_VERSION );
}
}
public function setSchemaVars( $vars );
/**
- * Check to see if a named lock is available (non-blocking)
+ * Check to see if a named lock is not locked by any thread (non-blocking)
*
* @param string $lockName Name of lock to poll
* @param string $method Name of method calling us
$thisPosByDomain = $this->getGtidCoordinates();
$thatPosByDomain = $pos->getGtidCoordinates();
if ( $thisPosByDomain && $thatPosByDomain ) {
- $reached = true;
- // Check that this has positions GTE all of those in $pos for all domains in $pos
+ $comparisons = [];
+ // Check that this has positions reaching those in $pos for all domains in common
foreach ( $thatPosByDomain as $domain => $thatPos ) {
- $thisPos = isset( $thisPosByDomain[$domain] ) ? $thisPosByDomain[$domain] : -1;
- $reached = $reached && ( $thatPos <= $thisPos );
+ if ( isset( $thisPosByDomain[$domain] ) ) {
+ $comparisons[] = ( $thatPos <= $thisPosByDomain[$domain] );
+ }
}
-
- return $reached;
+ // Check that $this has a GTID for at least one domain also in $pos; due to MariaDB
+ // quirks, prior master switch-overs may result in inactive garbage GTIDs that cannot
+ // be cleaned up. Assume that the domains in both this and $pos cover the relevant
+ // active channels.
+ return ( $comparisons && !in_array( false, $comparisons, true ) );
}
// Fallback to the binlog file comparisons
$thisPosDomains = array_keys( $this->getGtidCoordinates() );
$thatPosDomains = array_keys( $pos->getGtidCoordinates() );
if ( $thisPosDomains && $thatPosDomains ) {
- // Check that this has GTIDs for all domains in $pos
- return !array_diff( $thatPosDomains, $thisPosDomains );
+ // Check that $this has a GTID for at least one domain also in $pos; due to MariaDB
+ // quirks, prior master switch-overs may result in inactive garbage GTIDs that cannot
+ // easily be cleaned up. Assume that the domains in both this and $pos cover the
+ // relevant active channels.
+ return array_intersect( $thatPosDomains, $thisPosDomains ) ? true : false;
}
// Fallback to the binlog file comparisons
public function getAnyOpenConnection( $i );
/**
- * Get a connection by index
+ * Get a connection handle by server index
*
* Avoid using CONN_TRX_AUTO with sqlite (e.g. check getServerType() first)
*
+ * If the caller uses $domain or sets CONN_TRX_AUTO in $flags, then it must also
+ * call ILoadBalancer::reuseConnection() on the handle when finished using it.
+ * In all other cases, this is not necessary, though not harmful either.
+ *
* @param int $i Server index or DB_MASTER/DB_REPLICA
* @param array|string|bool $groups Query group(s), or false for the generic reader
* @param string|bool $domain Domain ID, or false for the current domain
* @param int $flags Bitfield of CONN_* class constants
*
+ * @note This method throws DBAccessError if ILoadBalancer::disable() was called
+ *
* @throws DBError
* @return Database
*/
*
* Avoid using CONN_TRX_AUTO with sqlite (e.g. check getServerType() first)
*
- * @note If disable() was called on this LoadBalancer, this method will throw a DBAccessError.
+ * If the caller uses $domain or sets CONN_TRX_AUTO in $flags, then it must also
+ * call ILoadBalancer::reuseConnection() on the handle when finished using it.
+ * In all other cases, this is not necessary, though not harmful either.
+ *
+ * @note This method throws DBAccessError if ILoadBalancer::disable() was called
*
* @param int $i Server index (does not support DB_MASTER/DB_REPLICA)
* @param string|bool $domain Domain ID, or false for the current domain
*/
class LoadBalancer implements ILoadBalancer {
/** @var array[] Map of (server index => server config array) */
- private $mServers;
+ private $servers;
/** @var Database[][][] Map of (connection category => server index => IDatabase[]) */
- private $mConns;
+ private $conns;
/** @var float[] Map of (server index => weight) */
- private $mLoads;
+ private $loads;
/** @var array[] Map of (group => server index => weight) */
- private $mGroupLoads;
+ private $groupLoads;
/** @var bool Whether to disregard replica DB lag as a factor in replica DB selection */
- private $mAllowLagged;
+ private $allowLagged;
/** @var int Seconds to spend waiting on replica DB lag to resolve */
private $waitTimeout;
/** @var array The LoadMonitor configuration */
/** @var Database DB connection object that caused a problem */
private $errorConnection;
/** @var int The generic (not query grouped) replica DB index (of $mServers) */
- private $mReadIndex;
+ private $readIndex;
/** @var bool|DBMasterPos False if not set */
- private $mWaitForPos;
+ private $waitForPos;
/** @var bool Whether the generic reader fell back to a lagged replica DB */
private $laggedReplicaMode = false;
/** @var bool Whether the generic reader fell back to a lagged replica DB */
private $allReplicasDownMode = false;
/** @var string The last DB selection or connection error */
- private $mLastError = 'Unknown error';
+ private $lastError = 'Unknown error';
/** @var string|bool Reason the LB is read-only or false if not */
private $readOnlyReason = false;
/** @var int Total connections opened */
if ( !isset( $params['servers'] ) ) {
throw new InvalidArgumentException( __CLASS__ . ': missing servers parameter' );
}
- $this->mServers = $params['servers'];
- foreach ( $this->mServers as $i => $server ) {
+ $this->servers = $params['servers'];
+ foreach ( $this->servers as $i => $server ) {
if ( $i == 0 ) {
- $this->mServers[$i]['master'] = true;
+ $this->servers[$i]['master'] = true;
} else {
- $this->mServers[$i]['replica'] = true;
+ $this->servers[$i]['replica'] = true;
}
}
? $params['waitTimeout']
: self::MAX_WAIT_DEFAULT;
- $this->mReadIndex = -1;
- $this->mConns = [
+ $this->readIndex = -1;
+ $this->conns = [
// Connection were transaction rounds may be applied
self::KEY_LOCAL => [],
self::KEY_FOREIGN_INUSE => [],
self::KEY_FOREIGN_INUSE_NOROUND => [],
self::KEY_FOREIGN_FREE_NOROUND => []
];
- $this->mLoads = [];
- $this->mWaitForPos = false;
- $this->mAllowLagged = false;
+ $this->loads = [];
+ $this->waitForPos = false;
+ $this->allowLagged = false;
if ( isset( $params['readOnlyReason'] ) && is_string( $params['readOnlyReason'] ) ) {
$this->readOnlyReason = $params['readOnlyReason'];
$this->loadMonitorConfig += [ 'lagWarnThreshold' => $this->maxLag ];
foreach ( $params['servers'] as $i => $server ) {
- $this->mLoads[$i] = $server['load'];
+ $this->loads[$i] = $server['load'];
if ( isset( $server['groupLoads'] ) ) {
foreach ( $server['groupLoads'] as $group => $ratio ) {
- if ( !isset( $this->mGroupLoads[$group] ) ) {
- $this->mGroupLoads[$group] = [];
+ if ( !isset( $this->groupLoads[$group] ) ) {
+ $this->groupLoads[$group] = [];
}
- $this->mGroupLoads[$group][$i] = $ratio;
+ $this->groupLoads[$group][$i] = $ratio;
}
}
}
foreach ( $lags as $i => $lag ) {
if ( $i != 0 ) {
# How much lag this server nominally is allowed to have
- $maxServerLag = isset( $this->mServers[$i]['max lag'] )
- ? $this->mServers[$i]['max lag']
+ $maxServerLag = isset( $this->servers[$i]['max lag'] )
+ ? $this->servers[$i]['max lag']
: $this->maxLag; // default
# Constrain that futher by $maxLag argument
$maxServerLag = min( $maxServerLag, $maxLag );
}
public function getReaderIndex( $group = false, $domain = false ) {
- if ( count( $this->mServers ) == 1 ) {
+ if ( count( $this->servers ) == 1 ) {
// Skip the load balancing if there's only one server
return $this->getWriterIndex();
- } elseif ( $group === false && $this->mReadIndex >= 0 ) {
+ } elseif ( $group === false && $this->readIndex >= 0 ) {
// Shortcut if the generic reader index was already cached
- return $this->mReadIndex;
+ return $this->readIndex;
}
if ( $group !== false ) {
// Use the server weight array for this load group
- if ( isset( $this->mGroupLoads[$group] ) ) {
- $loads = $this->mGroupLoads[$group];
+ if ( isset( $this->groupLoads[$group] ) ) {
+ $loads = $this->groupLoads[$group];
} else {
// No loads for this group, return false and the caller can use some other group
$this->connLogger->info( __METHOD__ . ": no loads for group $group" );
}
} else {
// Use the generic load group
- $loads = $this->mLoads;
+ $loads = $this->loads;
}
// Scale the configured load ratios according to each server's load and state
return false;
}
- if ( $this->mWaitForPos && $i != $this->getWriterIndex() ) {
+ if ( $this->waitForPos && $i != $this->getWriterIndex() ) {
// Before any data queries are run, wait for the server to catch up to the
// specified position. This is used to improve session consistency. Note that
// when LoadBalancer::waitFor() sets mWaitForPos, the waiting triggers here,
}
}
- if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $group === false ) {
+ if ( $this->readIndex <= 0 && $this->loads[$i] > 0 && $group === false ) {
// Cache the generic reader index for future ungrouped DB_REPLICA handles
- $this->mReadIndex = $i;
+ $this->readIndex = $i;
// Record if the generic reader index is in "lagged replica DB" mode
if ( $laggedReplicaMode ) {
$this->laggedReplicaMode = true;
// Quickly look through the available servers for a server that meets criteria...
$currentLoads = $loads;
while ( count( $currentLoads ) ) {
- if ( $this->mAllowLagged || $laggedReplicaMode ) {
+ if ( $this->allowLagged || $laggedReplicaMode ) {
$i = ArrayUtils::pickRandom( $currentLoads );
} else {
$i = false;
- if ( $this->mWaitForPos && $this->mWaitForPos->asOfTime() ) {
+ if ( $this->waitForPos && $this->waitForPos->asOfTime() ) {
// ChronologyProtecter sets mWaitForPos for session consistency.
// This triggers doWait() after connect, so it's especially good to
// avoid lagged servers so as to avoid excessive delay in that method.
- $ago = microtime( true ) - $this->mWaitForPos->asOfTime();
+ $ago = microtime( true ) - $this->waitForPos->asOfTime();
// Aim for <= 1 second of waiting (being too picky can backfire)
$i = $this->getRandomNonLagged( $currentLoads, $domain, $ago + 1 );
}
}
public function waitFor( $pos ) {
- $oldPos = $this->mWaitForPos;
+ $oldPos = $this->waitForPos;
try {
- $this->mWaitForPos = $pos;
+ $this->waitForPos = $pos;
// If a generic reader connection was already established, then wait now
- $i = $this->mReadIndex;
+ $i = $this->readIndex;
if ( $i > 0 ) {
if ( !$this->doWait( $i ) ) {
$this->laggedReplicaMode = true;
}
public function waitForOne( $pos, $timeout = null ) {
- $oldPos = $this->mWaitForPos;
+ $oldPos = $this->waitForPos;
try {
- $this->mWaitForPos = $pos;
+ $this->waitForPos = $pos;
- $i = $this->mReadIndex;
+ $i = $this->readIndex;
if ( $i <= 0 ) {
// Pick a generic replica DB if there isn't one yet
- $readLoads = $this->mLoads;
+ $readLoads = $this->loads;
unset( $readLoads[$this->getWriterIndex()] ); // replica DBs only
$readLoads = array_filter( $readLoads ); // with non-zero load
$i = ArrayUtils::pickRandom( $readLoads );
}
} finally {
# Restore the old position, as this is not used for lag-protection but for throttling
- $this->mWaitForPos = $oldPos;
+ $this->waitForPos = $oldPos;
}
return $ok;
public function waitForAll( $pos, $timeout = null ) {
$timeout = $timeout ?: $this->waitTimeout;
- $oldPos = $this->mWaitForPos;
+ $oldPos = $this->waitForPos;
try {
- $this->mWaitForPos = $pos;
- $serverCount = count( $this->mServers );
+ $this->waitForPos = $pos;
+ $serverCount = count( $this->servers );
$ok = true;
for ( $i = 1; $i < $serverCount; $i++ ) {
- if ( $this->mLoads[$i] > 0 ) {
+ if ( $this->loads[$i] > 0 ) {
$start = microtime( true );
$ok = $this->doWait( $i, true, $timeout ) && $ok;
$timeout -= ( microtime( true ) - $start );
}
} finally {
# Restore the old position, as this is not used for lag-protection but for throttling
- $this->mWaitForPos = $oldPos;
+ $this->waitForPos = $oldPos;
}
return $ok;
return;
}
- if ( !$this->mWaitForPos || $pos->hasReached( $this->mWaitForPos ) ) {
- $this->mWaitForPos = $pos;
+ if ( !$this->waitForPos || $pos->hasReached( $this->waitForPos ) ) {
+ $this->waitForPos = $pos;
}
}
* @return IDatabase|bool
*/
public function getAnyOpenConnection( $i ) {
- foreach ( $this->mConns as $connsByServer ) {
+ foreach ( $this->conns as $connsByServer ) {
if ( !empty( $connsByServer[$i] ) ) {
/** @var IDatabase[] $serverConns */
$serverConns = $connsByServer[$i];
$knownReachedPos = $this->srvCache->get( $key );
if (
$knownReachedPos instanceof DBMasterPos &&
- $knownReachedPos->hasReached( $this->mWaitForPos )
+ $knownReachedPos->hasReached( $this->waitForPos )
) {
$this->replLogger->debug(
__METHOD__ .
[ 'dbserver' => $server ]
);
- $result = $conn->masterPosWait( $this->mWaitForPos, $timeout );
+ $result = $conn->masterPosWait( $this->waitForPos, $timeout );
if ( $result === null ) {
$this->replLogger->warning(
__METHOD__ . ': Errored out waiting on {host} pos {pos}',
[
'host' => $server,
- 'pos' => $this->mWaitForPos,
+ 'pos' => $this->waitForPos,
'trace' => ( new RuntimeException() )->getTraceAsString()
]
);
__METHOD__ . ': Timed out waiting on {host} pos {pos}',
[
'host' => $server,
- 'pos' => $this->mWaitForPos,
+ 'pos' => $this->waitForPos,
'trace' => ( new RuntimeException() )->getTraceAsString()
]
);
$this->replLogger->info( __METHOD__ . ": Done" );
$ok = true;
// Remember that the DB reached this point
- $this->srvCache->set( $key, $this->mWaitForPos, BagOStuff::TTL_DAY );
+ $this->srvCache->set( $key, $this->waitForPos, BagOStuff::TTL_DAY );
}
if ( $close ) {
# Operation-based index
if ( $i == self::DB_REPLICA ) {
- $this->mLastError = 'Unknown error'; // reset error string
+ $this->lastError = 'Unknown error'; // reset error string
# Try the general server pool if $groups are unavailable.
$i = ( $groups === [ false ] )
? false // don't bother with this if that is what was tried above
: $this->getReaderIndex( false, $domain );
# Couldn't find a working server in getReaderIndex()?
if ( $i === false ) {
- $this->mLastError = 'No working replica DB server: ' . $this->mLastError;
+ $this->lastError = 'No working replica DB server: ' . $this->lastError;
// Throw an exception
$this->reportConnectionError();
return null; // not reached
}
$domain = $conn->getDomainID();
- if ( !isset( $this->mConns[$connInUseKey][$serverIndex][$domain] ) ) {
+ if ( !isset( $this->conns[$connInUseKey][$serverIndex][$domain] ) ) {
throw new InvalidArgumentException( __METHOD__ .
": connection $serverIndex/$domain not found; it may have already been freed." );
- } elseif ( $this->mConns[$connInUseKey][$serverIndex][$domain] !== $conn ) {
+ } elseif ( $this->conns[$connInUseKey][$serverIndex][$domain] !== $conn ) {
throw new InvalidArgumentException( __METHOD__ .
": connection $serverIndex/$domain mismatched; it may have already been freed." );
}
$conn->setLBInfo( 'foreignPoolRefCount', --$refCount );
if ( $refCount <= 0 ) {
- $this->mConns[$connFreeKey][$serverIndex][$domain] = $conn;
- unset( $this->mConns[$connInUseKey][$serverIndex][$domain] );
- if ( !$this->mConns[$connInUseKey][$serverIndex] ) {
- unset( $this->mConns[$connInUseKey][$serverIndex] ); // clean up
+ $this->conns[$connFreeKey][$serverIndex][$domain] = $conn;
+ unset( $this->conns[$connInUseKey][$serverIndex][$domain] );
+ if ( !$this->conns[$connInUseKey][$serverIndex] ) {
+ unset( $this->conns[$connInUseKey][$serverIndex] ); // clean up
}
$this->connLogger->debug( __METHOD__ . ": freed connection $serverIndex/$domain" );
} else {
} else {
// Connection is to the local domain
$connKey = $autoCommit ? self::KEY_LOCAL_NOROUND : self::KEY_LOCAL;
- if ( isset( $this->mConns[$connKey][$i][0] ) ) {
- $conn = $this->mConns[$connKey][$i][0];
+ if ( isset( $this->conns[$connKey][$i][0] ) ) {
+ $conn = $this->conns[$connKey][$i][0];
} else {
- if ( !isset( $this->mServers[$i] ) || !is_array( $this->mServers[$i] ) ) {
+ if ( !isset( $this->servers[$i] ) || !is_array( $this->servers[$i] ) ) {
throw new InvalidArgumentException( "No server with index '$i'." );
}
// Open a new connection
- $server = $this->mServers[$i];
+ $server = $this->servers[$i];
$server['serverIndex'] = $i;
$server['autoCommitOnly'] = $autoCommit;
if ( $this->localDomain->getDatabase() !== null ) {
$host = $this->getServerName( $i );
if ( $conn->isOpen() ) {
$this->connLogger->debug( "Connected to database $i at '$host'." );
- $this->mConns[$connKey][$i][0] = $conn;
+ $this->conns[$connKey][$i][0] = $conn;
} else {
$this->connLogger->warning( "Failed to connect to database $i at '$host'." );
$this->errorConnection = $conn;
$connInUseKey = self::KEY_FOREIGN_INUSE;
}
- if ( isset( $this->mConns[$connInUseKey][$i][$domain] ) ) {
+ if ( isset( $this->conns[$connInUseKey][$i][$domain] ) ) {
// Reuse an in-use connection for the same domain
- $conn = $this->mConns[$connInUseKey][$i][$domain];
+ $conn = $this->conns[$connInUseKey][$i][$domain];
$this->connLogger->debug( __METHOD__ . ": reusing connection $i/$domain" );
- } elseif ( isset( $this->mConns[$connFreeKey][$i][$domain] ) ) {
+ } elseif ( isset( $this->conns[$connFreeKey][$i][$domain] ) ) {
// Reuse a free connection for the same domain
- $conn = $this->mConns[$connFreeKey][$i][$domain];
- unset( $this->mConns[$connFreeKey][$i][$domain] );
- $this->mConns[$connInUseKey][$i][$domain] = $conn;
+ $conn = $this->conns[$connFreeKey][$i][$domain];
+ unset( $this->conns[$connFreeKey][$i][$domain] );
+ $this->conns[$connInUseKey][$i][$domain] = $conn;
$this->connLogger->debug( __METHOD__ . ": reusing free connection $i/$domain" );
- } elseif ( !empty( $this->mConns[$connFreeKey][$i] ) ) {
+ } elseif ( !empty( $this->conns[$connFreeKey][$i] ) ) {
// Reuse a free connection from another domain
- $conn = reset( $this->mConns[$connFreeKey][$i] );
- $oldDomain = key( $this->mConns[$connFreeKey][$i] );
+ $conn = reset( $this->conns[$connFreeKey][$i] );
+ $oldDomain = key( $this->conns[$connFreeKey][$i] );
if ( strlen( $dbName ) && !$conn->selectDB( $dbName ) ) {
- $this->mLastError = "Error selecting database '$dbName' on server " .
+ $this->lastError = "Error selecting database '$dbName' on server " .
$conn->getServer() . " from client host {$this->host}";
$this->errorConnection = $conn;
$conn = false;
} else {
$conn->tablePrefix( $prefix );
- unset( $this->mConns[$connFreeKey][$i][$oldDomain] );
+ unset( $this->conns[$connFreeKey][$i][$oldDomain] );
// Note that if $domain is an empty string, getDomainID() might not match it
- $this->mConns[$connInUseKey][$i][$conn->getDomainId()] = $conn;
+ $this->conns[$connInUseKey][$i][$conn->getDomainId()] = $conn;
$this->connLogger->debug( __METHOD__ .
": reusing free connection from $oldDomain for $domain" );
}
} else {
- if ( !isset( $this->mServers[$i] ) || !is_array( $this->mServers[$i] ) ) {
+ if ( !isset( $this->servers[$i] ) || !is_array( $this->servers[$i] ) ) {
throw new InvalidArgumentException( "No server with index '$i'." );
}
// Open a new connection
- $server = $this->mServers[$i];
+ $server = $this->servers[$i];
$server['serverIndex'] = $i;
$server['foreignPoolRefCount'] = 0;
$server['foreign'] = true;
} else {
$conn->tablePrefix( $prefix ); // as specified
// Note that if $domain is an empty string, getDomainID() might not match it
- $this->mConns[$connInUseKey][$i][$conn->getDomainID()] = $conn;
+ $this->conns[$connInUseKey][$i][$conn->getDomainID()] = $conn;
$this->connLogger->debug( __METHOD__ . ": opened new connection for $i/$domain" );
}
}
$conn = $this->errorConnection; // the connection which caused the error
$context = [
'method' => __METHOD__,
- 'last_error' => $this->mLastError,
+ 'last_error' => $this->lastError,
];
if ( $conn instanceof IDatabase ) {
);
// throws DBConnectionError
- $conn->reportConnectionError( "{$this->mLastError} ({$context['db_server']})" );
+ $conn->reportConnectionError( "{$this->lastError} ({$context['db_server']})" );
} else {
// No last connection, probably due to all servers being too busy
$this->connLogger->error(
);
// If all servers were busy, mLastError will contain something sensible
- throw new DBConnectionError( null, $this->mLastError );
+ throw new DBConnectionError( null, $this->lastError );
}
}
}
public function haveIndex( $i ) {
- return array_key_exists( $i, $this->mServers );
+ return array_key_exists( $i, $this->servers );
}
public function isNonZeroLoad( $i ) {
- return array_key_exists( $i, $this->mServers ) && $this->mLoads[$i] != 0;
+ return array_key_exists( $i, $this->servers ) && $this->loads[$i] != 0;
}
public function getServerCount() {
- return count( $this->mServers );
+ return count( $this->servers );
}
public function getServerName( $i ) {
- if ( isset( $this->mServers[$i]['hostName'] ) ) {
- $name = $this->mServers[$i]['hostName'];
- } elseif ( isset( $this->mServers[$i]['host'] ) ) {
- $name = $this->mServers[$i]['host'];
+ if ( isset( $this->servers[$i]['hostName'] ) ) {
+ $name = $this->servers[$i]['hostName'];
+ } elseif ( isset( $this->servers[$i]['host'] ) ) {
+ $name = $this->servers[$i]['host'];
} else {
$name = '';
}
}
public function getServerType( $i ) {
- return isset( $this->mServers[$i]['type'] ) ? $this->mServers[$i]['type'] : 'unknown';
+ return isset( $this->servers[$i]['type'] ) ? $this->servers[$i]['type'] : 'unknown';
}
public function getMasterPos() {
# master (however unlikely that may be), then we can fetch the position from the replica DB.
$masterConn = $this->getAnyOpenConnection( $this->getWriterIndex() );
if ( !$masterConn ) {
- $serverCount = count( $this->mServers );
+ $serverCount = count( $this->servers );
for ( $i = 1; $i < $serverCount; $i++ ) {
$conn = $this->getAnyOpenConnection( $i );
if ( $conn ) {
$conn->close();
} );
- $this->mConns = [
+ $this->conns = [
self::KEY_LOCAL => [],
self::KEY_FOREIGN_INUSE => [],
self::KEY_FOREIGN_FREE => [],
public function closeConnection( IDatabase $conn ) {
$serverIndex = $conn->getLBInfo( 'serverIndex' ); // second index level of mConns
- foreach ( $this->mConns as $type => $connsByServer ) {
+ foreach ( $this->conns as $type => $connsByServer ) {
if ( !isset( $connsByServer[$serverIndex] ) ) {
continue;
}
if ( $conn === $trackedConn ) {
$host = $this->getServerName( $i );
$this->connLogger->debug( "Closing connection to database $i at '$host'." );
- unset( $this->mConns[$type][$serverIndex][$i] );
+ unset( $this->conns[$type][$serverIndex][$i] );
--$this->connsOpened;
break 2;
}
public function allowLagged( $mode = null ) {
if ( $mode === null ) {
- return $this->mAllowLagged;
+ return $this->allowLagged;
}
- $this->mAllowLagged = $mode;
+ $this->allowLagged = $mode;
- return $this->mAllowLagged;
+ return $this->allowLagged;
}
public function pingAll() {
}
public function forEachOpenConnection( $callback, array $params = [] ) {
- foreach ( $this->mConns as $connsByServer ) {
+ foreach ( $this->conns as $connsByServer ) {
foreach ( $connsByServer as $serverConns ) {
foreach ( $serverConns as $conn ) {
$mergedParams = array_merge( [ $conn ], $params );
public function forEachOpenMasterConnection( $callback, array $params = [] ) {
$masterIndex = $this->getWriterIndex();
- foreach ( $this->mConns as $connsByServer ) {
+ foreach ( $this->conns as $connsByServer ) {
if ( isset( $connsByServer[$masterIndex] ) ) {
/** @var IDatabase $conn */
foreach ( $connsByServer[$masterIndex] as $conn ) {
}
public function forEachOpenReplicaConnection( $callback, array $params = [] ) {
- foreach ( $this->mConns as $connsByServer ) {
+ foreach ( $this->conns as $connsByServer ) {
foreach ( $connsByServer as $i => $serverConns ) {
if ( $i === $this->getWriterIndex() ) {
continue; // skip master
$lagTimes = $this->getLagTimes( $domain );
foreach ( $lagTimes as $i => $lag ) {
- if ( $this->mLoads[$i] > 0 && $lag > $maxLag ) {
+ if ( $this->loads[$i] > 0 && $lag > $maxLag ) {
$maxLag = $lag;
- $host = $this->mServers[$i]['host'];
+ $host = $this->servers[$i]['host'];
$maxIndex = $i;
}
}
$knownLagTimes = []; // map of (server index => 0 seconds)
$indexesWithLag = [];
- foreach ( $this->mServers as $i => $server ) {
+ foreach ( $this->servers as $i => $server ) {
if ( empty( $server['is static'] ) ) {
$indexesWithLag[] = $i; // DB server might have replication lag
} else {
$good = 0;
}
$edits = $options['changed'] ? 1 : 0;
- $total = $options['created'] ? 1 : 0;
+ $pages = $options['created'] ? 1 : 0;
DeferredUpdates::addUpdate( SiteStatsUpdate::factory(
- [ 'edits' => $edits, 'articles' => $good, 'total' => $total ]
+ [ 'edits' => $edits, 'articles' => $good, 'pages' => $pages ]
) );
DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content ) );
}
}
- /**
- * Get a FormOptions object containing the default options
- *
- * @return FormOptions
- */
- public function getDefaultOptions() {
- $opts = parent::getDefaultOptions();
-
- $opts->add( 'categories', '' );
- $opts->add( 'categories_any', false );
-
- return $opts;
- }
-
/**
* Get all custom filters
*
$join_conds
);
- // Build the final data
- if ( $this->getConfig()->get( 'AllowCategorizedRecentChanges' ) ) {
- $this->filterByCategories( $rows, $opts );
- }
-
return $rows;
}
*/
function getExtraOptions( $opts ) {
$opts->consumeValues( [
- 'namespace', 'invert', 'associated', 'tagfilter', 'categories', 'categories_any'
+ 'namespace', 'invert', 'associated', 'tagfilter'
] );
$extraOpts = [];
$extraOpts['namespace'] = $this->namespaceFilterForm( $opts );
- if ( $this->getConfig()->get( 'AllowCategorizedRecentChanges' ) ) {
- $extraOpts['category'] = $this->categoryFilterForm( $opts );
- }
-
$tagFilter = ChangeTags::buildTagFilterSelector(
$opts['tagfilter'], false, $this->getContext() );
if ( count( $tagFilter ) ) {
return [ $nsLabel, "$nsSelect $invert $associated" ];
}
- /**
- * Create an input to filter changes by categories
- *
- * @param FormOptions $opts
- * @return array
- */
- protected function categoryFilterForm( FormOptions $opts ) {
- list( $label, $input ) = Xml::inputLabelSep( $this->msg( 'rc_categories' )->text(),
- 'categories', 'mw-categories', false, $opts['categories'] );
-
- $input .= ' ' . Xml::checkLabel( $this->msg( 'rc_categories_any' )->text(),
- 'categories_any', 'mw-categories_any', $opts['categories_any'] );
-
- return [ $label, $input ];
- }
-
/**
* Filter $rows by categories set in $opts
*
+ * @deprecated since 1.31
+ *
* @param ResultWrapper &$rows Database rows
* @param FormOptions $opts
*/
function filterByCategories( &$rows, FormOptions $opts ) {
+ wfDeprecated( __METHOD__, '1.31' );
+
$categories = array_map( 'trim', explode( '|', $opts['categories'] ) );
if ( !count( $categories ) ) {
*/
use Wikimedia\Rdbms\IDatabase;
+use MediaWiki\MediaWikiServices;
/**
* Represents a "user group membership" -- a specific instance of a user belonging
}
// Purge old, expired memberships from the DB
- self::purgeExpired( $dbw );
+ JobQueueGroup::singleton()->push( new UserGroupExpiryJob() );
// Check that the values make sense
if ( $this->group === null ) {
/**
* Purge expired memberships from the user_groups table
- *
- * @param IDatabase|null $dbw
*/
- public static function purgeExpired( IDatabase $dbw = null ) {
- if ( wfReadOnly() ) {
+ public static function purgeExpired() {
+ $services = MediaWikiServices::getInstance();
+ if ( $services->getReadOnlyMode()->isReadOnly() ) {
return;
}
- if ( $dbw === null ) {
- $dbw = wfGetDB( DB_MASTER );
- }
+ $lbFactory = $services->getDBLoadBalancerFactory();
+ $ticket = $lbFactory->getEmptyTransactionTicket( __METHOD__ );
+ $dbw = $services->getDBLoadBalancer()->getConnection( DB_MASTER );
- DeferredUpdates::addUpdate( new AtomicSectionUpdate(
- $dbw,
- __METHOD__,
- function ( IDatabase $dbw, $fname ) {
- $expiryCond = [ 'ug_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ];
- $res = $dbw->select( 'user_groups', self::selectFields(), $expiryCond, $fname );
+ $lockKey = $dbw->getDomainID() . ':usergroups-prune'; // specific to this wiki
+ $scopedLock = $dbw->getScopedLockAndFlush( $lockKey, __METHOD__, 0 );
+ if ( !$scopedLock ) {
+ return; // already running
+ }
- // save an array of users/groups to insert to user_former_groups
- $usersAndGroups = [];
+ $now = time();
+ do {
+ $dbw->startAtomic( __METHOD__ );
+
+ $res = $dbw->select(
+ 'user_groups',
+ self::selectFields(),
+ [ 'ug_expiry < ' . $dbw->addQuotes( $dbw->timestamp( $now ) ) ],
+ __METHOD__,
+ [ 'FOR UPDATE', 'LIMIT' => 100 ]
+ );
+
+ if ( $res->numRows() > 0 ) {
+ $insertData = []; // array of users/groups to insert to user_former_groups
+ $deleteCond = []; // array for deleting the rows that are to be moved around
foreach ( $res as $row ) {
- $usersAndGroups[] = [ 'ufg_user' => $row->ug_user, 'ufg_group' => $row->ug_group ];
+ $insertData[] = [ 'ufg_user' => $row->ug_user, 'ufg_group' => $row->ug_group ];
+ $deleteCond[] = $dbw->makeList(
+ [ 'ug_user' => $row->ug_user, 'ug_group' => $row->ug_group ],
+ $dbw::LIST_AND
+ );
}
+ // Delete the rows we're about to move
+ $dbw->delete(
+ 'user_groups',
+ $dbw->makeList( $deleteCond, $dbw::LIST_OR ),
+ __METHOD__
+ );
+ // Push the groups to user_former_groups
+ $dbw->insert( 'user_former_groups', $insertData, __METHOD__, [ 'IGNORE' ] );
+ }
- // delete 'em all
- $dbw->delete( 'user_groups', $expiryCond, $fname );
+ $dbw->endAtomic( __METHOD__ );
- // and push the groups to user_former_groups
- $dbw->insert( 'user_former_groups', $usersAndGroups, __METHOD__, [ 'IGNORE' ] );
- }
- ) );
+ $lbFactory->commitAndWaitForReplication( __METHOD__, $ticket );
+ } while ( $res->numRows() > 0 );
}
/**
"newpageletter": "B",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 kalön {{PLURAL:$1|ureuëng ngui}}]",
- "rc_categories_any": "Pue-pue mantöng",
"rc-change-size-new": "$1 {{PLURAL:$1|bita}} lheuëh neuubah",
"newsectionsummary": "/* $1 */ bideung barô",
"rc-enhanced-expand": "Peuleumah rincian",
"minoreditletter": "ц",
"newpageletter": "КӀ",
"boteditletter": "б",
- "rc_categories_any": "ХэшыпыкIыгъэмэ ащыщ горэ",
"rc-change-size-new": "$1 {{PLURAL:$1|байт}} зэхъокӀым ыуж",
"newsectionsummary": "/* $1 */ секциякIэ",
"rc-enhanced-expand": "Ӏэмэ-псымэхэр къэгъэлъагъу",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|gebruiker|gebruikers}} hou die bladsy dop]",
- "rc_categories": "Beperk tot kategorieë (skei met \"|\"):",
- "rc_categories_any": "Enige van die gekose",
"rc-change-size-new": "$1 {{PLURAL:$1|greep|grepe}} na die wysiging",
"newsectionsummary": "/* $1 */ nuwe afdeling",
"rc-enhanced-expand": "Wys details",
"newpageletter": "baluhay",
"boteditletter": "kikay a tademaw",
"number_of_watching_users_pageview": "[$1 imahini miazihay a {{PLURAL:$1|misaungayay}}]",
- "rc_categories": "kakuniza kelec (ku \"|\" palaliyas):",
- "rc_categories_any": "amahicahica tu mipili’ay",
"rc-change-size-new": "masumadtu sa u $1 {{PLURAL:$1|wyiyincu}}",
"newsectionsummary": "/* $1 */ baluhay a tusil",
"rc-enhanced-expand": "paazih pulita kalunasulitan",
"newpageletter": "አ",
"boteditletter": "B",
"number_of_watching_users_pageview": "[$1 የሚከታተሉ {{PLURAL:$1|ተጠቃሚ|ተጠቃሚዎች}}]",
- "rc_categories_any": "ማንኛውም",
"newsectionsummary": "/* $1 */ አዲስ ክፍል",
"rc-enhanced-expand": "ዝርዝሩን አሳይ (JavaScript ያስፈልጋል)",
"rc-enhanced-hide": "ዝርዝሩን ደብቅ",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usuario|usuarios}} cosirando]",
- "rc_categories": "Limite ta las categorías (deseparatas por \"|\")",
- "rc_categories_any": "Todas",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} dimpués d'o cambio",
"newsectionsummary": "Nueva sección: /* $1 */",
"rc-enhanced-expand": "Amostrar detalles",
"minoreditletter": "ly",
"newpageletter": "N",
"boteditletter": "þr",
- "rc_categories_any": "Ǣnig",
"rc-enhanced-expand": "Īwan stafas",
"rc-enhanced-hide": "Hȳdan stafas",
"recentchangeslinked": "Sibba andwendunga",
"newpageletter": "ج",
"boteditletter": "ب",
"number_of_watching_users_pageview": "[{{PLURAL:$1|لا مستخدمون يراقبون|مستخدم واحد يراقب|مستخدمان يراقبان|$1 مستخدمين يراقبون|$1 مستخدما يراقب|$1 مستخدم يراقب}}]",
- "rc_categories": "حصر لتصنيفات (مفرقة برمز \"|\"):",
- "rc_categories_any": "أي من المختار",
"rc-change-size-new": "$1 {{PLURAL:$1|بايت|بايت}} بعد التغيير",
"newsectionsummary": "/* $1 */ قسم جديد",
"rc-enhanced-expand": "عرض التفاصيل",
"rollback-success": "تم استرجاع تعديلات {{GENDER:$3|$1}}، حتى آخر نسخة بواسطة {{GENDER:$4|$2}}.",
"rollback-success-notify": "تم استرجاع التعديلات بواسطة $1;\nتم التغيير إلى آخر مراجعة بواسطة $2. [$3 عرض التغييرات]",
"sessionfailure-title": "فشل في الجلسة",
- "sessionfailure": "Ù\8aبدÙ\88 Ø£Ù\86Ù\87 Ù\87Ù\86اÙ\83 Ù\85Ø´Ù\83Ù\84Ø© Ù\81Ù\8a جÙ\84سة اÙ\84دخÙ\88Ù\84 اÙ\84خاصة بÙ\83Ø\9b\nÙ\84Ø°Ù\84Ù\83 Ù\81Ù\82د Ø£Ù\84غÙ\8aت Ù\87Ø°Ù\87 اÙ\84عÙ\85Ù\84Ù\8aØ© Ù\83إجراء اØترازÙ\8a ضد اÙ\84اختراÙ\82.\nÙ\85Ù\86 Ù\81ضÙ\84Ù\83 اضغط عÙ\84Ù\89 Ù\85Ù\81ØªØ§Ø \"رجÙ\88ع\" Ù\84تØÙ\85Ù\8aÙ\84 اÙ\84صÙ\81ØØ© اÙ\84تÙ\8a جئت Ù\85Ù\86Ù\87اØ\8c Ø«Ù\85 ØاÙ\88Ù\84 مرة أخرى.",
+ "sessionfailure": "Ù\8aبدÙ\88 Ø£Ù\86Ù\87 Ù\87Ù\86اÙ\83 Ù\85Ø´Ù\83Ù\84Ø© Ù\81Ù\8a جÙ\84سة اÙ\84دخÙ\88Ù\84 اÙ\84خاصة بÙ\83Ø\9b\nÙ\84Ø°Ù\84Ù\83 Ù\81Ù\82د Ø£Ù\84غÙ\8aت Ù\87Ø°Ù\87 اÙ\84عÙ\85Ù\84Ù\8aØ© Ù\83إجراء اØترازÙ\8a ضد اÙ\84اختراÙ\82.\nÙ\85Ù\86 Ù\81ضÙ\84Ù\83 أعد إرساÙ\84 اÙ\84استÙ\85ارة مرة أخرى.",
"changecontentmodel": "غير نموذج المحتوى لصفحة",
"changecontentmodel-legend": "غير نموذج المحتوى",
"changecontentmodel-title-label": "عنوان الصفحة",
"watchlistedit-clear-titles": "العناوين:",
"watchlistedit-clear-submit": "امسح قائمة المراقبة (هذا دائم!)",
"watchlistedit-clear-done": "مُسِحت قائمة مراقبتك.",
+ "watchlistedit-clear-jobqueue": "قائمة مراقبتك يتم إفراغها. هذا قد يستغرق بعض الوقت!",
"watchlistedit-clear-removed": "{{PLURAL:$1||أزيل العنوان التالي|أزيل العنوانان التاليان|أزيلت العناوين ال$1 التالية}}:",
"watchlistedit-too-many": "الصفحات أكثر من أن تعرض هنا.",
"watchlisttools-clear": "امسح قائمة المراقبة",
"minoreditletter": "ܙ",
"newpageletter": "ܚ",
"boteditletter": "ܒ",
- "rc_categories_any": "ܐܝܢܐ ܕܗܘ",
"rc-change-size-new": "$1 {{PLURAL:$1|ܒܐܝܛ|ܒܐܝܛ̈ܐ}} ܒܬܪ ܫܘܚܠܦܐ",
"newsectionsummary": "/* $1 */ ܡܢܬܐ ܚܕܬܐ",
"rc-enhanced-expand": "ܚܘܝ ܐܪ̈ܝܟܬܐ",
"newpageletter": "J",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 katchof {{PLURAL:$1|mostkhdim|mostkhdimin}}]",
- "rc_categories": "limiti tsnifat (frqha b \"|\")",
- "rc_categories_any": "ay wahd",
"rc-change-size": "$1",
"newsectionsummary": "/* $1 */ qism jdid",
"rc-enhanced-expand": "Werri ṫ-ṫafaṣil (kayḫṫaj JavaScript)",
"newpageletter": "ج",
"boteditletter": "ب",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1| يوزر مراقب|يوزر مراقب}}]",
- "rc_categories": "حصر لتصنيفات (مفصولة برمز \"|\")",
- "rc_categories_any": "أى",
"rc-change-size-new": "$1 {{PLURAL:$1|بايت|بايتس}} بعد التغيير",
"newsectionsummary": "/* $1 */ قسم جديد",
"rc-enhanced-expand": "[اعرض التفاصيل]",
"newpageletter": "ন",
"boteditletter": "ব",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|জন সদস্যই|জন সদস্যই}} এই পৃষ্ঠা নিৰীক্ষণ কৰিছে]",
- "rc_categories": "শ্ৰেণীসমূহৰ সীমাবদ্ধতা (\"|\" দি পৃথক কৰক):",
- "rc_categories_any": "বাছনি কৰাৰ মাজত যিকোনো",
"rc-change-size-new": "$1 {{PLURAL:$1|বাইট}} যোগ দিয়া হ’ল",
"newsectionsummary": "/* $1 */ নতুন অনুচ্ছেদ",
"rc-enhanced-expand": "সবিশেষ দেখুৱাওক",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usuariu|usuarios}} vixilando]",
- "rc_categories": "Llendar a les categoríes (dixebrar con \"|\"):",
- "rc_categories_any": "Cualquiera de les esbillaes",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} dempués del cambiu",
"newsectionsummary": "/* $1 */ nueva seición",
"rc-enhanced-expand": "Amosar detalles",
"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.\nTorna a la páxina anterior, recarga esa páxina y vuelve a tentalo.",
+ "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",
"changecontentmodel-legend": "Cambiar el modelu de conteníu",
"changecontentmodel-title-label": "Títulu de la páxina",
"watchlistedit-clear-titles": "Títulos:",
"watchlistedit-clear-submit": "Llimpiar la llista de siguimientu (¡Esto ye permanente!)",
"watchlistedit-clear-done": "Llimpióse la to llista de siguimientu.",
+ "watchlistedit-clear-jobqueue": "Ta llimpiándose la llista de siguimientu. ¡Esta aición puede tardar daqué de tiempu!",
"watchlistedit-clear-removed": "{{PLURAL:$1|Desanicióse 1 títulu|Desaniciáronse $1 títulos}}:",
"watchlistedit-too-many": "Hai demasiaes páxines p'amosales equí.",
"watchlisttools-clear": "Llimpiar la llista de siguimientu",
"newpageletter": "W",
"boteditletter": "s",
"number_of_watching_users_pageview": "[$1 nedis {{PLURAL:$1|favesik|favesik}}]",
- "rc_categories": "Kimara kare loma yo (solparsana kan \"|\")",
- "rc_categories_any": "Kon",
"newsectionsummary": "/* $1 */ warzaf gabot",
"rc-enhanced-expand": "Pintanedira (JavaScript tir adraf)",
"rc-enhanced-hide": "Pintapalsera",
"newpageletter": "न",
"boteditletter": "बॉ",
"number_of_watching_users_pageview": "[$1 ध्यान राखय वाले {{PLURAL:$1|सदस्य}}]",
- "rc_categories": "श्रेणीन् तक सीमीत रक्खा जाय (\"|\" से अलग करा जाय)",
- "rc_categories_any": "कवनो भी",
"rc-change-size-new": "बदलाव कय बाद $1 {{PLURAL:$1|बाइट}}",
"newsectionsummary": "/* $1 */ नँवा अनुभाग",
"rc-enhanced-expand": "विस्तृत जानकारी देखावा जाय",
"newpageletter": "Y",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 izləyən istifadəçi]",
- "rc_categories": "Kateqoriyalara limit qoy (\"|\" ilə ayır)",
- "rc_categories_any": "Seçilənlərdən hər hansı biri",
"rc-change-size": "$1",
"rc-change-size-new": "Dəyişiklikdən sonrakı ölçü: $1 bayt",
"newsectionsummary": "/* $1 */ yeni bölmə",
"newpageletter": "ی",
"boteditletter": "ب",
"number_of_watching_users_pageview": "[{{PLURAL:$1|بیر|$1}} ایزلهین ایستیفادهچی]",
- "rc_categories": "بؤلمهلره محدودلاشدیر («|» ایله آییر)",
- "rc_categories_any": "سئچیلمیشلرین هر بیریسی",
"rc-change-size-new": "دَییشیکلیکدن سوْنرا {{PLURAL:|بیر|$1}} بایت",
"newsectionsummary": "/* $1 */ یئنی بؤلمه",
"rc-enhanced-expand": "تفصیللری گؤستر",
"newpageletter": "Я",
"boteditletter": "б",
"number_of_watching_users_pageview": "[$1 күҙәткән {{PLURAL:$1|ҡатнашыусы}}]",
- "rc_categories": "Тик категорияларҙан ғына (бүлеүсе «|»):",
- "rc_categories_any": "Һайланғандың теләһә ҡайһыһы",
"rc-change-size-new": "Үҙгәртештән һуң күләм: $1 {{PLURAL:$1|1=байт|байт}}",
"newsectionsummary": "/* $1 */ яңы бүлек",
"rc-enhanced-expand": "Ваҡ-төйәгенә тиклем күрһәтергә",
"newpageletter": "N",
"boteditletter": "B",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|beówochtender|beówochtende}} Benutzer]",
- "rc_categories": "Netter Seiten aus d' Kategorien (trennd mid \"l\"):",
- "rc_categories_any": "Olle",
"newsectionsummary": "Neicher Obschnit /* $1 */",
"rc-enhanced-expand": "Details zoagn (braucht JavaScript)",
"rc-enhanced-hide": "Details vastecka",
"newpageletter": "ن",
"boteditletter": "ب",
"number_of_watching_users_pageview": "[$1 چارگنت {{PLURAL:$1|کاربر|کابران}}]",
- "rc_categories": "محدودیت په دسته جات(دورش گون\"|\")",
- "rc_categories_any": "هرچی",
"rc-change-size-new": "$1 {{PLURAL:$1|بایت}} رند چه تغییر",
"newsectionsummary": "/* $1 */ نوکین بخش",
"rc-enhanced-expand": "جزئیاتء پیس دارگ",
"newpageletter": "B",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 naka-antabay sa {{PLURAL:$1|paragamit|mga paragamit}}]",
- "rc_categories": "Limitado sa mga kategorya (suhayon nin \"|\")",
- "rc_categories_any": "Dawà arín",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} pagtatapos kan pagbabago",
"newsectionsummary": "/* $1 */ bàgong seksyon",
"rc-enhanced-expand": "Ipahiling an mga detalye",
"right-deletelogentry": "выдаленьне і аднаўленьне асобных запісаў журналу",
"right-deleterevision": "выдаленьне і аднаўленьне асобных вэрсіяў старонак",
"right-deletedhistory": "Прагляд выдаленай гісторыі старонак бяз доступу да выдаленага тэксту",
- "right-deletedtext": "прагляд выдаленага тэксту і зьменаў паміж выдаленымі вэрсіямі старонак",
- "right-browsearchive": "пошук выдаленых старонак",
+ "right-deletedtext": "Ð\9fрагляд выдаленага тэксту і зьменаў паміж выдаленымі вэрсіямі старонак",
+ "right-browsearchive": "Ð\9fошук выдаленых старонак",
"right-undelete": "аднаўленьне старонак",
"right-suppressrevision": "праглядаць, хаваць і аднаўляць пэўныя вэрсіі старонак, зробленыя любым удзельнікам",
"right-viewsuppressed": "праглядаць вэрсіі старонак, схаваныя ад усіх удзельнікаў",
"newpageletter": "Н",
"boteditletter": "р",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|назіральнік|назіральнікі|назіральнікаў}}]",
- "rc_categories": "Абмежаваць катэгорыямі (разьдзяляйце знакам «|»):",
- "rc_categories_any": "Любая з абраных",
"rc-change-size-new": "$1 {{PLURAL:$1|байт|байты|байтаў}} пасьля зьмены",
"newsectionsummary": "/* $1 */ новая сэкцыя",
"rc-enhanced-expand": "Паказаць падрабязнасьці",
"newpageletter": "Н",
"boteditletter": "р",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|назіральнік|назіральнікі|назіральнікаў}}]",
- "rc_categories": "Абмежаваць катэгорыямі (размяжоўваць знакам \"|\"):",
- "rc_categories_any": "Любая з абраных",
"rc-change-size-new": "$1 {{PLURAL:$1|байт|байты|байтаў}} пасля змены",
"newsectionsummary": "/* $1 */ новы падраздзел",
"rc-enhanced-expand": "Паказаць падрабязнасці",
"newpageletter": "Н",
"boteditletter": "б",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|наблюдаващ потребител|наблюдаващи потребители}}]",
- "rc_categories": "Само от категории (разделител „|“)",
- "rc_categories_any": "Която и да е от избраните",
"rc-change-size-new": "$1 {{PLURAL:$1|байт|байта}} след редакцията",
"newsectionsummary": "Нова тема /* $1 */",
"rc-enhanced-expand": "Показване на детайли",
"newpageletter": "نوک",
"boteditletter": "ر",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کار زوروک}} دیستینوک]",
- "rc_categories": "ای تهرهانی حد ئا (گۆ «|» ئا جیتا کنیت)",
- "rc_categories_any": "هر گوجام",
"rc-change-size-new": "$1 {{PLURAL:$1|بایٹ}} پد شه تغیرا",
"newsectionsummary": "/* $1 */ نوکین بخش",
"rc-enhanced-expand": "جزئیات ئی نشان داتین",
"newpageletter": "न",
"boteditletter": "बॉ",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|प्रयोगकर्ता|प्रयोगकर्ता लोग}} के धियानसूची में बा]",
- "rc_categories": "श्रेणिन के सीमा (\"|\" से अलगा करीं):",
- "rc_categories_any": "बीछल में से कौनों एक ठो",
"rc-change-size-new": "बदलाव के बाद $1 {{PLURAL:$1|बाइट|बाइट्स}}",
"newsectionsummary": "/* $1 */ नया खंड",
"rc-enhanced-expand": "डिटेल देखावल जाय",
"newpageletter": "H",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|pa'itihi|papa'itihi}}]",
- "rc_categories": "Watasi tutumbung (pisahakan lawan \"|\")",
- "rc_categories_any": "Napa gin",
"rc-change-size-new": "$1 {{PLURAL:$1|bita|bita}} limbah paubahan",
"newsectionsummary": "/* $1 */ hagian hanyar",
"rc-enhanced-expand": "Tampaiakan rincian (parlu ada JavaScript)",
"newpageletter": "ন",
"boteditletter": "ব",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|জন ব্যবহারকারী|জন ব্যবহারকারী}} এই পাতার উপর নজর রাখছেন]",
- "rc_categories": "বিষয়শ্রেণীগুলিতে সীমা (\"|\" দিয়ে আলাদা করুন):",
- "rc_categories_any": "চয়নের জন্য যেকোনো কিছু",
"rc-change-size-new": "পরিবর্তনের পর $1 {{PLURAL:$1|বাইট}}",
"newsectionsummary": "/* $1 */ নতুন অনুচ্ছেদ",
"rc-enhanced-expand": "বিস্তারিত দেখাও",
"minoreditletter": "སྒྲིག་ཆུང་།",
"newpageletter": "ཤོག་གསར།",
"boteditletter": "རང་འགུལ་འཕྲུལ་ཆས།",
- "rc_categories_any": "གང་རུང་།",
"rc-enhanced-expand": "ཞིབ་ཕྲར་སྟོན།",
"rc-enhanced-hide": "ཞིབ་ཕྲ་སྦས་བ།",
"recentchangeslinked": "འབྲེལ་བའི་བཟོ་བཅོས།",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|implijer o heuliañ|implijer}} o heuliañ]",
- "rc_categories": "Bevenniñ d'ar rummadoù (dispartiet gant \"|\") :",
- "rc_categories_any": "Unan e-touez ar re zibabet",
"rc-change-size-new": "$1 {{PLURAL:$1|okted|okted}} goude kemmañ",
"newsectionsummary": "/* $1 */ rann nevez",
"rc-enhanced-expand": "Diskouez ar munudoù",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|korisnik|korisnika}} koji pregledaju]",
- "rc_categories": "Ograniči na kategorije (razdvoji sa \"|\"):",
- "rc_categories_any": "Bilo koju odabranu",
"rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} poslije izmjene",
"newsectionsummary": "/* $1 */ novi odlomak",
"rc-enhanced-expand": "Prikaži detalje",
"minoreditletter": "m",
"newpageletter": "B",
"boteditletter": "b",
- "rc_categories_any": "Dawa uno",
"newsectionsummary": "/* $1 */ bagong seksyon",
"rc-enhanced-expand": "Ipabayad a mga detalye",
"filename": "Filename",
"botpasswords-insert-failed": "No s'ha pogut afegir el nom del bot «$1». Ja hi estava afegit?",
"botpasswords-update-failed": "No s'ha pogut actualitzar el nom del bot «$1». Hi estava suprimit?",
"botpasswords-created-title": "S'ha creat la contrasenya del bot",
- "botpasswords-created-body": "S'ha creat la contrasenya per al bot «$1» de l'usuari «$2».",
+ "botpasswords-created-body": "S'ha creat la contrasenya per al bot «$1» de {{GENDER:$2||l'usuari|la usuària}} «$2».",
"botpasswords-updated-title": "Contrasenya de bot actualitzada",
- "botpasswords-updated-body": "La contrasenya pel bot «$1» de l'usuari «$2» ha estat actualitzada.",
+ "botpasswords-updated-body": "La contrasenya pel bot «$1» de {{GENDER:$2|l'usuari|la usuària}} «$2» ha estat actualitzada.",
"botpasswords-deleted-title": "S'ha eliminat la contrasenya del bot",
- "botpasswords-deleted-body": "La contrasenya del bot \"$1\", pertanyent a l'usuari \"$2\", ha estat eliminada.",
+ "botpasswords-deleted-body": "La contrasenya pel bot «$1» de {{GENDER:$2|l'usuari|la usuària}} «$2» ha estat eliminada.",
"botpasswords-newpassword": "La nova contrasenya per a iniciar sessió amb <strong>$1</strong> és <strong>$2</strong>. <em>Guardeu-la de cara al futur.</em><br> (Per a bots vells que necessiten que el nom per a iniciar sessió sigui el mateix que el nom d'usuari, també podeu usar <strong>$3</strong> com a nom d'usuari i <strong>$4</strong> com a contrasenya.)",
"botpasswords-no-provider": "BotPasswordsSessionProvider no està disponible.",
"botpasswords-restriction-failed": "Les restriccions de contrasenyes de bots impedeixen aquest inici de sessió.",
"recentchangesdays-max": "(màxim $1 {{PLURAL:$1|dia|dies}})",
"recentchangescount": "Nombre d'edicions a mostrar per defecte:",
"prefs-help-recentchangescount": "Inclou els canvis recents, els historials de pàgines i els registres.",
- "prefs-help-watchlist-token2": "Aquesta és la clau secreta pel canal de continguts de la vostra llista de seguiment.\nQualsevol que la conegui podria llegir la vostra llista de seguiment, així que no la compartiu.\n[[Special:ResetTokens|Cliqueu aquí si voleu restaurar-la]].",
+ "prefs-help-watchlist-token2": "Aquesta és la clau secreta pel canal de continguts de la vostra llista de seguiment.\nQualsevol que la conegui podria llegir la vostra llista de seguiment, així que no la compartiu.\nSi és necessari, [[Special:ResetTokens|la podeu restaurar]].",
"savedprefs": "S’han desat les vostres preferències.",
"savedrights": "S'han desat els grups d'usuari de {{GENDER:$1|$1}}.",
"timezonelegend": "Fus horari:",
"recentchanges-legend": "Opcions de canvis recents",
"recentchanges-summary": "Seguiu els canvis més recents del wiki en aquesta pàgina.",
"recentchanges-noresult": "Cap canvi corresponent a aquests criteris en el període indicat.",
+ "recentchanges-timeout": "Aquesta cerca ha temporitzat. Podeu provar amb paràmetres de cerca diferents.",
+ "recentchanges-network": "A causa d'un error tècnic no s'ha pogut recuperar cap resultat. Intenteu refrescar la pàgina.",
"recentchanges-feed-description": "Segueix en aquest canal els canvis més recents del wiki.",
"recentchanges-label-newpage": "Aquesta modificació creà una pàgina",
"recentchanges-label-minor": "Aquesta és una modificació menor",
"rcfilters-filter-previousrevision-label": "No la darrera revisió",
"rcfilters-filter-previousrevision-description": "Tots els canvis que no són «la darrera revisió».",
"rcfilters-filter-excluded": "Exclòs",
+ "rcfilters-tag-prefix-namespace-inverted": "<strong>:no</strong> $1",
"rcfilters-exclude-button-off": "Exclou els seleccionats",
"rcfilters-exclude-button-on": "Excloent els seleccionats",
"rcfilters-view-tags": "Canvis etiquetats",
"boteditletter": "b",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[{{PLURAL:$1|Un usuari vigila|$1 usuaris vigilen}} aquesta pàgina]",
- "rc_categories": "Limita a les categories (separades amb «|»):",
- "rc_categories_any": "Qualsevol de les triades",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} després del canvi",
"newsectionsummary": "/* $1 */ secció nova",
"recentchangeslinked-feed": "Canvis relacionats",
"recentchangeslinked-toolbox": "Canvis relacionats",
"recentchangeslinked-title": "Canvis relacionats amb «$1»",
- "recentchangeslinked-summary": "Aquesta llista reflecteix els canvis recents a les pàgines enllaçades des d'una pàgina concreta (o als membres d'una categoria concreta).\nLes pàgines de la vostra [[Special:Watchlist|llista de seguiment]] apareixen en <strong>negreta</strong>.",
+ "recentchangeslinked-summary": "Introduïu un nom de pàgina per veure els canvis en les pàgines enllaçades des de o cap a aquesta pàgina (per veure els membres d'una categoria, introduïu Categoria:Nom de la categoria).\nEls canvis en pàgines de la vostra [[Special:Watchlist|llista de seguiment]] apareixen en <strong>negreta</strong>.",
"recentchangeslinked-page": "Nom de la pàgina:",
"recentchangeslinked-to": "Mostra els canvis de les pàgines enllaçades amb la pàgina donada",
"recentchanges-page-added-to-category": "[[:$1]] afegida a la categoria",
"doubleredirects": "Redireccions dobles",
"doubleredirectstext": "Aquesta pàgina llista les pàgines que redirigeixen a altres pàgines de redirecció.\nCada fila conté enllaços a la primera i la segona redireccions, així com la destinació de la segona redirecció, que generalment és la pàgina de destinació \"real\" a la qual hauria d'apuntar la primera redirecció.\nLes entrades <del>ratllades</del> s'han resolt.",
"double-redirect-fixed-move": "S'ha reanomenat [[$1]].\nS'ha actualitzat automàticament i ara redirigeix a [[$2]].",
- "double-redirect-fixed-maintenance": "S'ha arreglat automàticament la redirecció doble de [[$1]] a [[$2]] en un treball de manteniment.",
+ "double-redirect-fixed-maintenance": "Correcció automàtica de la redirecció doble de [[$1]] a [[$2]] en un tasca de manteniment",
"double-redirect-fixer": "Supressor de dobles redireccions",
"brokenredirects": "Redireccions rompudes",
"brokenredirectstext": "Les següents redireccions enllacen a pàgines inexistents:",
"import-mapping-namespace": "Importa a un espai de noms:",
"import-mapping-subpage": "Importa com a subpàgines de la pàgina següent:",
"import-upload-filename": "Nom de fitxer:",
+ "import-upload-username-prefix": "Prefix interwiki:",
"import-comment": "Comentari:",
"importtext": "Exporteu el fitxer des del wiki d'origen utilitzant l'[[Special:Export|eina d'exportació]].\nDeseu-lo al vostre ordinador i carregueu-ne una còpia ací.",
"importstart": "S'estan important pàgines...",
"version-poweredby-others": "altres",
"version-poweredby-translators": "Traductors de translatewiki.net",
"version-credits-summary": "El nostre reconeixement a les següents persones per la seva aportació a [[Special:Version|MediaWiki]]",
- "version-license-info": "MediaWiki és programari lliure, podeu redistribuir-lo i/o modificar-lo sota els termes de la Llicència Pública General GNU publicada per la Free Software Foundation, sigui de la seva versió 2 o (a elecció vostra) de qualsevol versió posterior. \n\nMediaWiki es distribueix en l'esperança de ser d'utilitat, però SENSE CAP GARANTIA; ni tan sols la garantia implícita de COMERCIALITZACIÓ o ADEQUACIÓ A UNA FINALITAT DETERMINADA. En trobareu més detalls a la Llicència Pública General GNU.\n\nAmb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còpia de la Llicència Pública General GNU]; si no és així, adreceu-vos a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o bé [//www.gnu.org/licenses/old-licenses/gpl-2.0.html llegiu-la en línia].",
+ "version-license-info": "MediaWiki és programari lliure, podeu redistribuir-lo i/o modificar-lo sota els termes de la Llicència Pública General GNU publicada per la Free Software Foundation, sigui de la seva versió 2 o (a elecció vostra) de qualsevol versió posterior. \n\nMediaWiki es distribueix en l'esperança de ser d'utilitat, però <em>SENSE CAP GARANTIA</em>; ni tan sols la garantia implícita de <strong>COMERCIALITZACIÓ</strong> o <strong>ADEQUACIÓ A UNA FINALITAT DETERMINADA</strong>. Vegeu la Llicència Pública General GNU per a més informació.\n\nAmb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còpia de la Llicència Pública General GNU]; si no és així, adreceu-vos a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o bé [//www.gnu.org/licenses/old-licenses/gpl-2.0.html llegiu-la en línia].",
"version-software": "Programari instal·lat",
"version-software-product": "Producte",
"version-software-version": "Versió",
"newpageletter": "К",
"boteditletter": "б",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|тӀехьожу декъашхо|тӀехьожу декъашхой}}]",
- "rc_categories": "Категори чура бен (къасторг «|»)",
- "rc_categories_any": "Муьлха а хаьржиначух",
"rc-change-size-new": "Хийцам бин чул тӀехьа болу барам: $1 {{PLURAL:$1|байт}}",
"newsectionsummary": "/* $1 */ Керла хьедар",
"rc-enhanced-expand": "Гайта мадарра",
"newpageletter": "ن",
"boteditletter": "بۆت",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|بەکارھێنەر}}ی چاودێر]",
- "rc_categories": "بەرتەسککردنەوە بە هاوپۆلەکان (به «|» جیای بکەوە)",
- "rc_categories_any": "هەرکامێک بێت",
"rc-change-size-new": "$1 {{PLURAL:$1|بایت}} پاش گۆڕانکاری",
"newsectionsummary": "/* $1 */ بەشی نوێ",
"rc-enhanced-expand": "وردەکارییەکان نیشان بدە",
"newpageletter": "Я",
"boteditletter": "б",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|1=къулланыджы|къулланыджы}} козете]",
- "rc_categories": "Тек категориялардан («|» иле айырыла)",
- "rc_categories_any": "Эр анги",
"rc-change-size-new": "Денъиштирильген сонъ $1 {{PLURAL:$1|байт|байт}}",
"newsectionsummary": "/* $1 */ янъы болюк",
"rc-enhanced-expand": "Тафсилятыны косьтер",
"newpageletter": "Y",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|qullanıcı|qullanıcı}} közete]",
- "rc_categories": "Tek kategoriyalardan (\"|\" ile ayırıla)",
- "rc_categories_any": "Er angi",
"rc-change-size-new": "Deñiştirilgen soñ $1 {{PLURAL:$1|bayt|bayt}}",
"newsectionsummary": "/* $1 */ yañı bölük",
"rc-enhanced-expand": "Tafsilâtını köster",
"newpageletter": "N",
"boteditletter": "r",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|sledující uživatel|sledující uživatelé|sledujících uživatelů}}]",
- "rc_categories": "Omezit na kategorie (oddělené „|“):",
- "rc_categories_any": "Jakákoli z vybraných",
"rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajty|bajtů}} po změně",
"newsectionsummary": "Nová sekce /* $1 */",
"rc-enhanced-expand": "Zobrazit detaily",
"minoreditletter": "м҃л",
"newpageletter": "н҃в",
"boteditletter": "а҃ѵ",
- "rc_categories_any": "Любы из выбраных",
"rc-change-size-new": "$1 {{PLURAL:$1|баитъ|баита|баитъ}} послѣди мѣнꙑ",
"rc-old-title": "напрьва страница створѥна ꙗко ⁖ $1 ⁖",
"recentchangeslinked": "съвѧꙁанꙑ страницѧ",
"newpageletter": "Ç",
"boteditletter": "б",
"unpatrolledletter": "!",
- "rc_categories_any": "Кашни",
"newsectionsummary": "/* $1 */ Çĕнĕ тема",
"recentchangeslinked": "Çыхăннă улшăнусем",
"recentchangeslinked-feed": "Çыхăннă улшăнусем",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|defnyddwyr|defnyddiwr|ddefnyddiwr|defnyddiwr|defnyddiwr|o ddefnyddwyr}} yn gwylio]",
- "rc_categories": "Cyfyngu i gategorïau (gwahanwch gyda \"|\")",
- "rc_categories_any": "Unrhyw un",
"rc-change-size-new": "$1 {{PLURAL:$1|beit}} wedi'r newid",
"newsectionsummary": "/* $1 */ adran newydd",
"rc-enhanced-expand": "Dangos y manylion",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|overvågende bruger|overvågende brugere}}]",
- "rc_categories": "Grænse for kategorier (adskilt med \"|\"):",
- "rc_categories_any": "Nogen af de valgte",
"rc-change-size": "$1 {{PLURAL:$1|Byte|Bytes}}",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} efter ændring",
"newsectionsummary": "/* $1 */ nyt afsnit",
"right-editmyprivateinfo": "Eigene private Daten bearbeiten (beispielsweise E-Mail-Adresse, richtiger Name)",
"right-override-export-depth": "Exportiere Seiten einschliesslich verlinkter Seiten bis zu einer Tiefe von 5",
"recentchanges-label-plusminus": "Die Änderung der Seitengrösse in Bytes",
- "rc_categories": "Nur Seiten aus den Kategorien (getrennt mit «|»):",
"rc-change-size-new": "$1 {{PLURAL:$1|Byte|Bytes}} nach der Änderung",
"rc-old-title": "ursprünglich erstellt als «$1»",
"recentchangeslinked-title": "Änderungen an Seiten, die von «$1» verlinkt sind",
"newpageletter": "N",
"boteditletter": "B",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|beobachtender|beobachtende}} Benutzer]",
- "rc_categories": "Nur Seiten aus den Kategorien (getrennt mit „|“):",
- "rc_categories_any": "Beliebige der ausgewählten",
"rc-change-size": "$1 {{PLURAL:$1|Byte|Bytes}}",
"rc-change-size-new": "$1 {{PLURAL:$1|Byte|Bytes}} nach der Änderung",
"newsectionsummary": "Neuer Abschnitt /* $1 */",
"boteditletter": "b",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 ho seyr keno {{PLURAL:$1|karber|karberî}}]",
- "rc_categories": "Kategoriyan rêz kı ( \"|“ ya ciya yo):",
- "rc_categories_any": "Weçinayiyan ra her yew",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|bayt|bayti}} ra dıma vurnayış",
"newsectionsummary": "/* $1 */ qısımo newe",
"newpageletter": "N",
"boteditletter": "B",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|wobglědowaŕ|wobglědowarja|wobglědowarje}}]",
- "rc_categories": "Jano boki z kategorijow (źělone z pomocu „|“):",
- "rc_categories_any": "wše",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|byta|byty|bytow}} pó změnje",
"newsectionsummary": "Nowy wótrězk /* $1 */",
"rc-enhanced-expand": "Drobnostki pokazaś",
"minoreditletter": "ना",
"newpageletter": "नौ",
"boteditletter": "बो",
- "rc_categories": "श्रेणीहरूमी सीमित (\"|\" ले छुट्याओ)",
"rc-change-size-new": "$1 {{PLURAL:$1|बाइट|बाइट्स}}फेरबदल पाछा",
"recentchangeslinked": "सम्बन्धित फेरबदल",
"recentchangeslinked-toolbox": "सम्बन्धित फेरबदल",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[vésta da {{PLURAL:$1|un utèint|$1 utèint}}]",
- "rc_categories": "Lémita al categoréi (separêdi da \"|\")",
- "rc_categories_any": "Bast' ech sia fra còli sgnêdi",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} dôp la mudéfica",
"newsectionsummary": "/* $1 */ sesiòn nōva",
"rc-enhanced-expand": "Fà vèder i particulêr.",
"newpageletter": "Ν",
"boteditletter": "ρ",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|χρήστης|χρήστες}} παρακολουθούν]",
- "rc_categories": "Περιορίστε τις κατηγορίες (διαχωρίστε τις με \"|\"):",
- "rc_categories_any": "Οποιαδήποτε από τις επιλεγμένες",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} μετά από την αλλαγή",
"newsectionsummary": "/* $1 */ νέα ενότητα",
"rc-enhanced-expand": "Εμφάνιση λεπτομερειών",
"unpatrolledletter": "!",
"number_of_watching_users_RCview": "[$1]",
"number_of_watching_users_pageview": "[$1 watching {{PLURAL:$1|user|users}}]",
- "rc_categories": "Limit to categories (separate with \"|\"):",
- "rc_categories_any": "Any of the chosen",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} after change",
"newsectionsummary": "/* $1 */ new section",
"newpageletter": "N",
"boteditletter": "r",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|priatentanta uzanto|priatentantaj uzantoj}}]",
- "rc_categories": "Nur paĝoj el jenaj kategorioj (disigu per \"|\"):",
- "rc_categories_any": "Iuj el la elektitaj",
"rc-change-size-new": "$1 {{PLURAL:$1|bitoko|bitokoj}} post ŝanĝo",
"newsectionsummary": "/* $1 */ nova sekcio",
"rc-enhanced-expand": "Montri detalojn (per JavaScript)",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usuario|usuarios}} vigilando]",
- "rc_categories": "Limitar a categorías (sep.: |):",
- "rc_categories_any": "Cualquiera de las elegidas",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} después del cambio",
"newsectionsummary": "Sección nueva: /* $1 */",
"rc-enhanced-expand": "Mostrar detalles",
"newpageletter": "U",
"boteditletter": "R",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|jälgiv kasutaja|jälgivat kasutajat}}]",
- "rc_categories": "Ainult neist kategooriatest (eraldajaks \"|\"):",
- "rc_categories_any": "Mõnes valitutest",
"rc-change-size-new": "$1 {{PLURAL:$1|bait|baiti}} pärast muudatust",
"newsectionsummary": "/* $1 */ uus alaosa",
"rc-enhanced-expand": "Näita üksikasju",
"newpageletter": "B",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|lankide|lankide}} jarraitzen]",
- "rc_categories": "Kategorietara mugatu (\"|\" karaktereaz banandu):",
- "rc_categories_any": "Aukeratutako edozein",
"rc-change-size-new": "{{PLURAL:$1|Byte 1|$1 byte}} aldaketaren ostean",
"newsectionsummary": "/* $1 */ atal berria",
"rc-enhanced-expand": "Erakutsi xehetasunak",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usuáriu está|usuárius están}} vehilandu]",
- "rc_categories": "Arrayal a categorias (separás pol \"|\")",
- "rc_categories_any": "Cualisquiá",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} dempués el chambu",
"newsectionsummary": "/* $1 */ seción nueva",
"rc-enhanced-expand": "muestral detallis (es mestel JavaScript)",
"newpageletter": "نو",
"boteditletter": "ر",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کاربر}} پیگیرنده]",
- "rc_categories": "محدود به این ردهها (ردهها را با «|» جدا کنید):",
- "rc_categories_any": "هر کدام از منتخبها",
"rc-change-size-new": "$1 {{PLURAL:$1|بایت}} پس از تغییر",
"newsectionsummary": "/* $1 */ بخش جدید",
"rc-enhanced-expand": "نمایش جزئیات",
"newpageletter": "U",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|tarkkaileva käyttäjä|tarkkailevaa käyttäjää}}]",
- "rc_categories": "Rajoita luokkiin (erota luokat merkillä ”|”)",
- "rc_categories_any": "Mikä tahansa valituista",
"rc-change-size-new": "$1 {{PLURAL:$1|tavu|tavua}} muutosten jälkeen",
"newsectionsummary": "/* $1 */ uusi osio",
"rc-enhanced-expand": "Näytä yksityiskohdat",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 ansar eftir {{PLURAL:$1|brúkara|brúkarum}}]",
- "rc_categories": "Avmarkað til síður frá bólkunum (skil sundur við \"|\")",
- "rc_categories_any": "Nakar",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} eftir broyting",
"newsectionsummary": "/* $1 */ nýtt innlegg",
"rc-enhanced-expand": "Vís smálutir",
"boteditletter": "b",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 utilisateur{{PLURAL:$1||s}} en train de suivre]",
- "rc_categories": "Limiter aux catégories (séparées par « | ») :",
- "rc_categories_any": "Une des sélectionnées",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|octet|octets}} après changement",
"newsectionsummary": "/* $1 */ nouvelle section",
"newpageletter": "N",
"boteditletter": "r",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|utilisator qu’est|utilisators que sont}} aprés siuvre]",
- "rc_categories": "Limitar a les catègories (sèparâyes per « | ») :",
- "rc_categories_any": "Yona de les chouèsies",
"rc-change-size-new": "$1 octèt{{PLURAL:$1||s}} aprés changement",
"newsectionsummary": "/* $1 */ novèla sèccion",
"rc-enhanced-expand": "Montrar los dètalys",
"newpageletter": "N",
"boteditletter": "B",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|brüker|brükern}}, diar tuluke]",
- "rc_categories": "Bluas sidjen ütj jo kategoriin (apdiald mä „|“):",
- "rc_categories_any": "Arke ütjsoocht",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} efter't feranrin",
"newsectionsummary": "Nei kirew /* $1 */",
"rc-enhanced-expand": "Enkelthaiden wise",
"newpageletter": "G",
"boteditletter": "b",
"number_of_watching_users_pageview": "[tignude di voli di {{PLURAL:$1|un utent|$1 utents}}]",
- "rc_categories": "Limite aes categoriis (dividilis cun \"|\")",
- "rc_categories_any": "Cualsisei",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} dopo la modifiche",
"newsectionsummary": "/* $1 */ gnove sezion",
"rc-enhanced-expand": "Cjale i detais (al covente JavaScript)",
"boteditletter": "b",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 folgjende {{PLURAL:$1|meidogger|meidoggers}}]",
- "rc_categories": "Alline kategoryen (skiede mei in \"|\")",
- "rc_categories_any": "Elk",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} nei de wiziging",
"newsectionsummary": "/* $1 */ nije seksje",
"newpageletter": "N",
"boteditletter": "r",
"number_of_watching_users_pageview": "[{{PLURAL:$1|úsáideoir amháin|$1 úsáideoirí}} ag faire]",
- "rc_categories_any": "Aon chatagóir",
"rc-change-size-new": "$1 {{PLURAL:$1|bheart|beart}} tar éis an athraithe",
"newsectionsummary": "/* $1 */ mír nua",
"rc-enhanced-expand": "Taispeáin mionsonraithe",
"newpageletter": "新",
"boteditletter": "机",
"number_of_watching_users_pageview": "[$1只监视用户]",
- "rc_categories": "分类界定(用\"|\"隔开)",
- "rc_categories_any": "任何",
"newsectionsummary": "/* $1 */ 新段落",
"rc-enhanced-expand": "显到细节(需要 JavaScript)",
"rc-enhanced-hide": "弆到细节",
"newpageletter": "新",
"boteditletter": "機",
"number_of_watching_users_pageview": "[$1隻監視用戶]",
- "rc_categories": "分類界定(用\"|\"隔開)",
- "rc_categories_any": "任何",
"newsectionsummary": "/* $1 */ 新段落",
"rc-enhanced-expand": "顯到細節(需要 JavaScript)",
"rc-enhanced-hide": "弆到細節",
"boteditletter": "bt",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[Tha $1 {{PLURAL:$1|chleachdaiche|chleachdaiche|cleachdaichean|cleachdaiche}} a' cumail sùil air]",
- "rc_categories": "Dìreach sna roinnean-seòrsa (sgaraich le “|”):",
- "rc_categories_any": "Gin dhe na chaidh a thaghadh",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|bhaidht|bhaidht|baidhtichean|baidht}} às dèidh an atharrachaidh",
"newsectionsummary": "Earrann ùr /* $1 */",
"boteditletter": "b",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usuario|usuarios}} vixiando]",
- "rc_categories": "Limitar ás categorías (separadas por \"|\"):",
- "rc_categories_any": "Calquera das elixidas",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} despois da modificación",
"newsectionsummary": "Nova sección: /* $1 */",
"minoreditletter": "द",
"newpageletter": "न",
"boteditletter": "र",
- "rc_categories_any": "वेंचिल्ल्या मदलें खंयचेय",
"rc-change-size-new": "$1 {{बहुवचन:$1|byte|bytes}}बदल केल्या उपरांत",
"rc-enhanced-expand": "म्हायती दाखय",
"rc-enhanced-hide": "म्हायती लिपय",
"minoreditletter": "d",
"newpageletter": "N",
"boteditletter": "r",
- "rc_categories_any": "Vinchlele modlem khuimchem-i",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|byti}} bodol kel'lea uprant",
"rc-enhanced-expand": "Bariksann dakhoi",
"rc-enhanced-hide": "Bariksann lipoi",
"newpageletter": "Ν",
"boteditletter": "αὐτ",
"number_of_watching_users_pageview": "[$1 ἐφορᾶν {{PLURAL:$1|χρώμενον|χρωμένους}}]",
- "rc_categories": "Ὅριον κατηγοριῶν (σήμανσις διαχωρίσεως: \"|\")",
- "rc_categories_any": "Οἵα δήποτε",
"rc-change-size-new": "$1 {{PLURAL:$1|δυφιολέξις|δυφιολέξεις}} μεθύστερον μεταβολής",
"newsectionsummary": "/* $1 */ νέον τμῆμα",
"rc-enhanced-expand": "Δεικνύναι λεπτομέρειας (ἀπαιτεῖ JavaScript)",
"newpageletter": "N",
"boteditletter": "B",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|Benutzer, wu beobachtet|Benutzer, wu beobachte}}]",
- "rc_categories": "Nume Syten us bestimmte Kategorie (mit «|» trenne):",
- "rc_categories_any": "Beliebigi vo den usgwählte",
"rc-change-size-new": "$1 {{PLURAL:$1|Byte|Byte}} no dr Änderig",
"newsectionsummary": "Neje Abschnitt /* $1 */",
"rc-enhanced-expand": "Detail aazeige",
"newpageletter": "નવું",
"boteditletter": "બૉટ",
"number_of_watching_users_pageview": "[$1 જોઇરહેલ {{PLURAL:$1|સભ્ય|સભ્યો}}]",
- "rc_categories": "શ્રેણીઓ સુધી મર્યાદિત (\"|\" થી જુદા પાડો):",
- "rc_categories_any": "કોઇ પણ પસંદ કરેલ",
"rc-change-size-new": "બદલાયા પછી $1 {{PLURAL:$1|બાઈટ|બાઇટ્સ}}",
"newsectionsummary": "/* $1 */ નવો વિભાગ",
"rc-enhanced-expand": "વિગતો બતાવો",
"minoreditletter": "m",
"newpageletter": "N",
"boteditletter": "r",
- "rc_categories_any": "Ronney erbee",
"rc-enhanced-expand": "Taishbyn sonreeaghtyn (ta feme er JavaScript)",
"rc-enhanced-hide": "Follee sonreeaghtyn",
"recentchangeslinked": "Caghlaaghyn conastagh",
"newpageletter": "Sîn",
"boteditletter": "kî",
"number_of_watching_users_pageview": "[$1隻用戶關注]",
- "rc_categories": "分類界限(以“|”分割)",
- "rc_categories_any": "任意",
"rc-change-size-new": "Kiên-kói heu ke $1 vi-ngièn-chû",
"rc-enhanced-expand": "展示細節 (愛有JavaScript)",
"rc-enhanced-hide": "隱藏細節",
"newpageletter": "ח",
"boteditletter": "ב",
"number_of_watching_users_pageview": "[{{PLURAL:$1|משתמש אחד עוקב|$1 משתמשים עוקבים}} אחרי הדף]",
- "rc_categories": "הגבלה לקטגוריות (מופרדות בתו \"|\"):",
- "rc_categories_any": "כל אחת מהנבחרות",
"rc-change-size-new": "{{PLURAL:$1|בית אחד|$1 בתים}} לאחר השינוי",
"newsectionsummary": "/* $1 */ פסקה חדשה",
"rc-enhanced-expand": "הצגת הפרטים",
"newpageletter": "न",
"boteditletter": "बॉ",
"number_of_watching_users_pageview": "[$1 ध्यान रखने वाले {{PLURAL:$1|सदस्य}}]",
- "rc_categories": "श्रेणीयों तक सीमीत रखें (\"|\" से अलग करें)",
- "rc_categories_any": "कोई भी चुनिन्दा",
"rc-change-size-new": "बदलाव के बाद $1 {{PLURAL:$1|बाइट}}",
"newsectionsummary": "/* $1 */ नया अनुभाग",
"rc-enhanced-expand": "विस्तृत जानकारी दिखाएँ",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|user|users}} ke dekhta hae]",
- "rc_categories": "Categories me limit (\"|\" se separate karo)",
- "rc_categories_any": "Chuna gais me se koi",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} badlao ke baad",
"newsectionsummary": "/* $1 */ nawaa vibhag",
"rc-enhanced-expand": "Details dekhao",
"newpageletter": "B",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 ginabantayan {{PLURAL:$1|naga-usar|mga naga-usar}}]",
- "rc_categories": "Limitahan ang mga kategorya (ibulag lakip sang \"|\")",
- "rc_categories_any": "Bisan ano",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|mga byte}} pagkatapos sang pag-ilis",
"newsectionsummary": "/* $1 */ bag-o nga seksyon",
"rc-enhanced-expand": "Ipakita ang mga detalye",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|suradnik|suradnika|suradnika}} prati ovu stranicu]",
- "rc_categories": "Ograniči na kategorije (odvoji sa \"|\")",
- "rc_categories_any": "Bilo koji od odabranih",
"rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} poslije uređivanja",
"newsectionsummary": "/* $1 */ novi odlomak",
"rc-enhanced-expand": "Pokaži detalje (potreban JavaScript)",
"newpageletter": "N",
"boteditletter": "B",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|beobachtender|beobachtende}} Benutzer]",
- "rc_categories": "Nur Seite aus den Kategorie (getrennt mit „|“):",
- "rc_categories_any": "Alle",
"rc-change-size-new": "$1 {{PLURAL:$1|Byte|Bytes}} noh der Ännrung",
"newsectionsummary": "Neier Abschnitt /* $1 */",
"rc-enhanced-expand": "Einzelheite oonzeiche",
"newpageletter": "N",
"boteditletter": "B",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|wobkedźbowacy wužiwar|wobkedźbowacaj wužiwarjej|wobkedźbowacy wužiwarjo|wobkedźbowacych wužiwarjow}}]",
- "rc_categories": "Jenož kategorije (dźělene z \"|\")",
- "rc_categories_any": "Někajka z wubranych",
"rc-change-size": "$1 {{PLURAL:$1|bajt|bajtaj|bajty|bajtow}}",
"rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajtaj|bajty|bajtow}} po změnje",
"newsectionsummary": "Nowy wotrězk: /* $1 */",
"newpageletter": "Ú",
"boteditletter": "b",
"number_of_watching_users_pageview": "[Jelenleg {{PLURAL:$1|egy|$1}} felhasználó figyeli]",
- "rc_categories": "Szűkítés kategóriákra („|” jellel válaszd el őket):",
- "rc_categories_any": "Választottak közül bármelyik",
"rc-change-size-new": "$1 bájt módosítás után",
"newsectionsummary": "/* $1 */ (új szakasz)",
"rc-enhanced-expand": "Részletek megjelenítése",
"newpageletter": "Ն",
"boteditletter": "բ",
"number_of_watching_users_pageview": "[$1 հսկող {{PLURAL:$1|մասնակից|մասնակիցներին}}]",
- "rc_categories": "Սահմանափակել կատեգորիաներով (բաժանեք «|» նշանով)",
- "rc_categories_any": "Բոլոր",
"rc-change-size-new": "$1 {{PLURAL:$1|բայթ|բայթ}} փոփոխությունից հետո",
"newsectionsummary": "/* $1 */ Նոր բաժին",
"rc-enhanced-expand": "Ցուցադրել մանրամասներ (պահանջում է ՋավաՍկրիպտ)",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[observate per $1 {{PLURAL:$1|usator|usatores}}]",
- "rc_categories": "Limitar al categorias (separar con \"|\"):",
- "rc_categories_any": "Qualcunque categoria seligite",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} post cambio",
"newsectionsummary": "/* $1 */ nove section",
"rc-enhanced-expand": "Revelar detalios",
"boteditletter": "b",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|pemantau|pemantau}}]",
- "rc_categories": "Batasi sampai kategori (dipisah dengan \"|\"):",
- "rc_categories_any": "Setiap yang terpilih",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|bita}} setelah perubahan",
"newsectionsummary": "/* $1 */ bagian baru",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|ọ'bànifé|ọ'bànifé}} ne lé anya]",
- "rc_categories_any": "Nkówụlà",
"newsectionsummary": "/* $1 */ nkeji ohúrù",
"rc-enhanced-expand": "Zi ihe di ime (Í gí nwere JavaScript)",
"rc-enhanced-hide": "Zonari ihe di ime",
"newpageletter": "B",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 nga agbuybuya {{PLURAL:$1|nga agar-aramat|kadagiti agar-aramat}}]",
- "rc_categories": "Patingga dagiti kategoria (pagsinaen iti \"|\"):",
- "rc_categories_any": "Ti ania man a napili",
"rc-change-size-new": "$1 {{PLURAL:$1|a byte|kadagiti byte}} kalpasan ti panagsukat",
"newsectionsummary": "/* $1 */ baro a seksion",
"rc-enhanced-expand": "Ipakita dagiti salaysay",
"minoreditletter": "зI",
"newpageletter": "К",
"boteditletter": "б",
- "rc_categories_any": "МоллагIа яр хержа йолчарна юкъера",
"rc-change-size-new": "Хувцам баьнначул тӀехьагIа бола боарам: $1 {{PLURAL:$1|байт}}",
"rc-enhanced-expand": "Хьахьокха ма дарра",
"rc-enhanced-hide": "Къайладаккха ма дарра дар",
"minoreditletter": "m",
"newpageletter": "N",
"boteditletter": "r",
- "rc_categories_any": "Irga selektita",
"rc-change-size-new": "$1 {{PLURAL:$1|bicoko|bicoki}} pos la modifiki",
"newsectionsummary": "/* $1 */ nova seciono",
"rc-enhanced-expand": "Montrez detali",
"boteditletter": "v",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[{{PLURAL:$1|notandi skoðandi|$1 notendur skoðandi}}]",
- "rc_categories": "Takmarka við flokka (aðskilja með \"|\"):",
- "rc_categories_any": "Allt valið",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|bæt|bæti}} eftir breytingu",
"newsectionsummary": "Nýr hluti: /* $1 */",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[osservata da {{PLURAL:$1|un utente|$1 utenti}}]",
- "rc_categories": "Limita alle categorie (separate da \"|\"):",
- "rc_categories_any": "Qualsiasi fra quelle indicate",
"rc-change-size-new": "$1 {{PLURAL:$1|byte}} dopo la modifica",
"newsectionsummary": "/* $1 */ nuova sezione",
"rc-enhanced-expand": "Mostra dettagli",
"boteditletter": "ボ",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[{{PLURAL:$1|$1 人の利用者}}がウォッチしています]",
- "rc_categories": "カテゴリを限定 (「|」で区切る):",
- "rc_categories_any": "選択したもの全部",
"rc-change-size": "$1",
"rc-change-size-new": "変更後は $1 {{PLURAL:$1|バイト}}",
"newsectionsummary": "/* $1 */ 新しい節",
"newpageletter": "A",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|cacahé sing ngawasi|cacahé sing ngawasi}}]",
- "rc_categories": "Watesi tekan kategori (dipisah nganggo \"|\")",
- "rc_categories_any": "Apa waé sing dipilih",
"rc-change-size-new": "$1 {{PLURAL:$1|bét|bét}} sawisé diowahi",
"newsectionsummary": "/* $1 */ pérangan anyar",
"rc-enhanced-expand": "Tuduhaké princèn",
"boteditletter": "რ",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 მომხმარებლის/ები კონტროლი]",
- "rc_categories": "მხოლოდ კატეგორიებიდან (გამყოფი „|“)",
- "rc_categories_any": "არჩეულიდან ნებისმიერი",
"rc-change-size": "$1",
"rc-change-size-new": "ზომა ცვლილების შემდეგ არის: {{PLURAL:$1|ბაიტი|ბაიტი}}",
"newsectionsummary": "/* $1 */ ახალი სექცია",
"newpageletter": "T",
"boteditletter": "b",
"number_of_watching_users_pageview": "[Baqlag'an {{PLURAL:$1|1 paydalanıwshı|$1 paydalanıwshı}}]",
- "rc_categories": "Kategoriyalarg'a sheklew (\"|\" belgisi menen ajıratın')",
- "rc_categories_any": "Ha'r qanday",
"newsectionsummary": "/* $1 */ taza bo'lim",
"rc-enhanced-expand": "Tolıq mag'lıwmattı ko'rsetiw (JavaScriptti talap etedi)",
"rc-enhanced-hide": "Tolıq mag'lıwmattı jasırıw",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|aɛessas|iɛessasen}}]",
- "rc_categories": "Ḥedded i taggayin (ferreq s \"|\")",
- "rc_categories_any": "Yiwet seg tid yettwafernen",
"rc-change-size-new": "$1 {{PLURAL:$1|atamḍan|itamḍanen}} seld abeddel",
"newsectionsummary": "/* $1 */ tigezmi tamaynut",
"rc-enhanced-expand": "Ẓeṛ ttfaṣil",
"newpageletter": "ج",
"boteditletter": "ب",
"number_of_watching_users_pageview": "[باقىلاعان $1 قاتىسۋشى]",
- "rc_categories": "ساناتتارعا شەكتەۋ (\"|\" بەلگىسىمەن بولىكتەڭىز)",
- "rc_categories_any": "قايسىبىر",
"newsectionsummary": "/* $1 */ جاڭا ٴبولىم",
"recentchangeslinked": "قاتىستى وزگەرىستەر",
"recentchangeslinked-feed": "قاتىستى وزگەرىستەر",
"newpageletter": "Ж",
"boteditletter": "б",
"number_of_watching_users_pageview": "[бақылаған $1 қатысушы]",
- "rc_categories": "Санаттарға шектеу («|» белгісімен бөлектеңіз):",
- "rc_categories_any": "Таңдалғанның кез келгені",
"rc-change-size-new": "Өңдеуден кейінгі көлемі: $1 {{PLURAL:$1|байт|байт}}",
"newsectionsummary": "/* $1 */ жаңа бөлім",
"rc-enhanced-expand": "Толық ақпаратты көрсету",
"newpageletter": "J",
"boteditletter": "b",
"number_of_watching_users_pageview": "[baqılağan $1 qatıswşı]",
- "rc_categories": "Sanattarğa şektew (\"|\" belgisimen bölikteñiz)",
- "rc_categories_any": "Qaýsıbir",
"newsectionsummary": "/* $1 */ jaña bölim",
"recentchangeslinked": "Qatıstı özgerister",
"recentchangeslinked-feed": "Qatıstı özgerister",
"newpageletter": "ថ្មី",
"boteditletter": "យន្ត",
"number_of_watching_users_pageview": "[មាន{{PLURAL:$1|អ្នកប្រើប្រាស់|អ្នកប្រើប្រាស់}}$1នាក់កំពុងមើល]",
- "rc_categories": "កំហិតត្រឹមចំណាត់ថ្នាក់ក្រុម(ខណ្ឌដោយសញ្ញា \"|\")៖",
- "rc_categories_any": "មួយណាក៏បាន",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|បៃ|បៃ}} បន្ទាប់ពីបន្លាស់ប្ដូរ",
"newsectionsummary": "/* $1 */ ផ្នែកថ្មី",
"newpageletter": "ಹೊ",
"boteditletter": "ಬಾ",
"number_of_watching_users_pageview": "[$1 ವೀಕ್ಷಿಸುತ್ತಿರುವ {{PLURAL:$1|ಸದಸ್ಯ|ಸದಸ್ಯರು}}]",
- "rc_categories": "ವರ್ಗಗಳಿಗೆ ಮಾತ್ರ ಸೀಮಿತವಾಗಿಸು (\"|\" ಇಂದ ಬೇರ್ಪಡಿಸು)",
- "rc_categories_any": "ಯಾವುದೇ",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ಬದಲಾವಣೆಯ ನಂತರ",
"newsectionsummary": "/* $1 */ ಹೊಸ ವಿಭಾಗ",
"rc-enhanced-expand": "ವಿವರಗಳನ್ನು ತೋರಿಸು",
"newpageletter": "새글",
"boteditletter": "봇",
"number_of_watching_users_pageview": "[{{PLURAL:$1|사용자}} $1명이 주시하고 있음]",
- "rc_categories": "다음 분류로 제한 (\"|\"로 구분):",
- "rc_categories_any": "선택된 것 중 아무거나",
"rc-change-size-new": "바꾼 후 $1 {{PLURAL:$1|바이트}}",
"newsectionsummary": "/* $1 */ 새 문단",
"rc-enhanced-expand": "자세한 내용 보기",
"rollback-success": "{{GENDER:$3|$1}}의 편집을 되돌렸습니다.\n{{GENDER:$4|$2}}의 마지막 판으로 바뀌었습니다.",
"rollback-success-notify": "$1의 편집을 되돌렸습니다.\n$2의 마지막 판으로 바뀌었습니다. [$3 차이 보기]",
"sessionfailure-title": "세션 실패",
- "sessionfailure": "로그인 세션에 문제가 발생한 것 같습니다.\n세션 하이재킹을 막기 위해 동작이 취소되었습니다.\n브라우저의 뒤로 버튼을 누르고 문서를 새로 고침한 후에 다시 시도해 주세요.",
+ "sessionfailure": "로그인 세션에 문제가 발생한 것 같습니다.\n세션 하이재킹을 막기 위해 동작이 취소되었습니다.\n양식을 다시 제출해 주십시오.",
"changecontentmodel": "문서의 콘텐츠 모델을 변경",
"changecontentmodel-legend": "콘텐츠 모델 변경",
"changecontentmodel-title-label": "문서 제목",
"newpageletter": "Дж",
"boteditletter": "б",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|кёзюнде тутуучу къошулуучу}}]",
- "rc_categories": "Къуру бу категорияладан («|» бла айыр):",
- "rc_categories_any": "Сайланнгандан къайсысы да",
"rc-change-size": "$1",
"rc-change-size-new": "Тюрлениуден сора ёлчеми: $1 {{PLURAL:$1|байт}}",
"newsectionsummary": "/* $1 */ Джангы бёлюм",
"boteditletter": "B",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[{{PLURAL:$1|eine|$1|kein}} Oppasser]",
- "rc_categories": "Bejränz op de Saachjroppe (schrihv „|“ dozwesche):",
- "rc_categories_any": "Öhndseijne vun dä aanjejovve Saachjroppe",
"rc-change-size": "$1 {{PLURAL:$1|Byte|Bytes}}",
"rc-change-size-new": "$1 {{PLURAL:$1|Byte|Bytes|Bytes}} noh dem Ändere",
"newsectionsummary": "Neuje Afschnet /* $1 */",
"newpageletter": "Nû",
"boteditletter": "b",
"number_of_watching_users_pageview": "[{{PLURAL:$1|bikarhênerek|$1 bikarhêner}} vê rûpelê {{PLURAL:$1|dişopîne|dişopînin}}.]",
- "rc_categories_any": "Qet",
"rc-change-size-new": "Piştî guhertinê $1 {{PLURAL:$1|bayt}}",
"newsectionsummary": "/* $1 */ beşeke nû",
"rc-enhanced-expand": "Hûragahiyan nîşan bide",
"category_header": "\"$1\" категориядан сагьифалар",
"subcategories": "Субкатегориялар",
"category-media-header": "\"$1\" категориядагъы сапламлар",
+ "category-empty": "\"Бу категория буссагьат бош.\"",
"hidden-categories": "{{PLURAL:$1|Яшырылгъан категория|Яшырылгъан категориялар}}",
+ "category-subcat-count": "{{PLURAL:$2|Бу категорияда янгыз гелеген тюп категориясы бар.|Бу категорияда янгыз гелеген $2 тюп категорядан {{PLURAL:$1|тюп категория}} гёрсетилген.}}",
+ "category-article-count": "{{PLURAL:$2|Бу категорияда янгыз гелеген бир сагьифа бар.|Бу категорияда бар $2 сагьифаны {{PLURAL:$1|сагьифасы}} гёрсетилген.}}",
"listingcontinuesabbrev": "давам",
"noindex-category": "Индексленмейген сагьифалар",
"broken-file-category": "Ишлеймейген саплам байланывлары булан сагьифалар",
"jumptosearch": "излев",
"aboutsite": "{{SITENAME}} гьакъында",
"aboutpage": "Project:Сыпатлав",
+ "copyright": "Ичделиги $1 лисензиягъа гёре гиришли (башгъасы мекенленмеген буса).",
"copyrightpage": "{{ns:project}}:Ясавчу гьакълар",
"currentevents": "Гьалиги гьаллар",
"currentevents-url": "Project:Гьалиги гьаллар",
"showdiff": "Тюзлевлени гёрсетмек",
"loginreqlink": "гирмек",
"noarticletext": "Бу сагьифа гьали де матынсыз. Сен башгъа сагьифаларда [[Special:Search/{{PAGENAME}}|булай атын эсгеривлерини излемеге]] боласан, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тийишли гюнделик язывланы тапмагъа] яда '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} булай аты булан сагьифа яратмагъа боласан]'''</span>.",
+ "noarticletext-nopermission": "Бу сагьифа гьали де текстсиз. Сен башгъа сагьифаларда [[Special:Search/{{PAGENAME}}|булай атын эсгеривлерини излемеге]], яда <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тийишли гюнделиклени тапмагъа боласан]. </span> Тек бу сагьифаны яратмагъа ихтиярынг ёкъ.",
"userpage-userdoesnotexist-view": "\"$1\" гьисап къайытланмагъан.",
"previewnote": "<strong>Бу ингкъарав экенни эсде сакъла.</strong>\nАлышынывларынг гьали де сакъланмагъан!",
"continue-editing": "Тюзлевню давамламакъ",
"hiddencategories": "Бу сагьифа {{PLURAL:$1|1 яшырылгъан категориягъа}} янаша:",
"permissionserrors": "Гириш ихтиярланы хатасы",
"permissionserrorstext-withaction": "Бугъар $2 гелеген {{PLURAL:$1|себепге|себеплеге}} гёре ихтиярынг ёкъ:",
+ "recreate-moveddeleted-warn": "<strong>Тергев бер: Алдын тайдырылгъан сагьифаны ярашдырма айланасан.</strong>\n\nБашлап тергеп къара, гертиден де тарыкъмы экен ол сагьифаны ярашдырмагъа.\nТайдырыв ва атын алышдырыв гюнделиги тюпде берилген:",
"content-model-wikitext": "викиматын",
"undo-failure": "Аралыкъ алышынывланы къыйышывсызлгъы учун тюзлев гери алынмай.",
"viewpagelogs": "Бу сагьифа учун гюнделиклени гёрсетмек",
"editundo": "гери алмакъ",
"diff-empty": "(башгъалыкълар ёкъ)",
"diff-multi-sameuser": "(шо къоллавчуну {{PLURAL:$1|$1 аралыкъ тюрю}} гёрсетилмеген)",
+ "diff-multi-otherusers": "({{PLURAL:$2|къоллавчуну}}{{PLURAL:$1|аралыкъ тюзлевю|$1 аралыкъ тюзлевлери}} гёрсетилмеген)",
"searchresults": "Излевню натижалар",
"searchresults-title": "\"$1\" учун натижаланы излемек",
"prevn": "алдагъы {{PLURAL:$1|$1}}",
"nextn-title": "Гелеген $1 {{PLURAL:$1|гьасил}}",
"shown-title": "Айры бир сагьифада $1 {{PLURAL:$1|языв|язывланы}} гёрсетмек",
"viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) къарамакъ",
+ "searchmenu-exists": "<strong>Бу викиде \"[[:$1]]\" деп аты булан сагьифа бар.</strong> {{PLURAL:$2|0=|Дагъы да табылгъан натижалагъа да къара.}}",
"searchmenu-new": "<strong>\"[[:$1]]\" сагьифа бу викиде яратмакъ!</strong> {{PLURAL:$2|0=|Излевюнге кёре табылгъан сагьифалагъа да къара.|Дагъы да излев гьасиллеге къара.}}",
"searchprofile-articles": "Аслу сагьифалар",
"searchprofile-images": "Мюлтимедиа",
"searchprofile-everything-tooltip": "Бары да сагьифаларда излемек (сёйлешив сагьифаланы да къошуп)",
"searchprofile-advanced-tooltip": "Сайлангъан аралыкъларда излемек",
"search-result-size": "$1 ({{PLURAL:$2|1 сёз|$2 сёз}})",
+ "search-result-category-size": "{{PLURAL:$1|1 ортакъчы|$1 ортакъчы}} ({{PLURAL:$2|1 тюп категория|$2 тюп категория}}, {{PLURAL:$3|1 саплам|$3 саплам}})",
"search-redirect": "($1 сагьифадан бакъдырылгъан)",
"search-section": "($1 бёлме)",
"search-file-match": "(сапламны ичделигине рас геле)",
"recentchangeslinked-feed": "Байлавлу тюзлевлер",
"recentchangeslinked-toolbox": "Байлавлу тюзлевлер",
"recentchangeslinked-title": "\"$1\" сагьифагъа байлавлу тюзлевлер",
+ "recentchangeslinked-summary": "Бу сагьифагъа байлавлу тюзлевлери булан сагьифаланы яда о сагьифа байлавлуланы гёрмек учун атын яз. (Категорияны ортакъчаларын гёрмек учун Category:категорияны атын яз). Сени [[Special:Watchlist|гьызарлав тизменгдеги]] алышынывлар <strong>къалын</strong> гьарплылар.",
"recentchangeslinked-page": "Сагьифаны аты:",
"recentchangeslinked-to": "Къайта, бу сагьифагъа байлавлу сагьифаланы алышынывларын гёрсетмек",
"upload": "Сапламны юклемек",
"statistics": "Истатистик",
"double-redirect-fixer": "Ёллав дуруславу",
"nbytes": "$1 {{PLURAL:$1|байт|байтлар}}",
+ "nmembers": "$1 {{PLURAL:$1|ортакъчы}}",
"prefixindex": "Префикс булан бары да сагьифалар",
"listusers": "Ортакъчы тизмеси",
"newpages": "Янгы сагьифалар",
"speciallogtitlelabel": "Мурат (аты яда {{ns:user}}:ортакъчы):",
"log": "Гюнделиклер",
"all-logs-page": "Бары да гиришли гюнделиклер",
+ "alllogstext": "{{SITENAME}} сайфаны жыйымлы гюнделик тизмеси.\nНатижаланы гюнделик тайпасына, ортакъчы атына (уллу-гиччи гьарпланы гьисапгъа алып) яда тийилген сагьифасына (уллу-гиччи гьарпланы гьисапгъа алып) гёре айырма боласан.",
"logempty": "Къыйышывлу язывлар гюнделикде ёкъ.",
"allpages": "Бары сагьифалар",
"allarticles": "Бары сагьифалар",
"namespace": "Атлар аралыгъы:",
"invert": "Сайлангъанын айландырмакъ",
"namespace_association": "Байланышлы атлар аралыгъы",
+ "tooltip-namespace_association": "Сайлангъан атысакъламагъа байлавлу атсакъламаны, пикирлешивлени къошмакъ учун бу белгини де сал.",
"blanknamespace": "(Аслу)",
"contributions": "{{GENDER:$1|Къоллавчуну}} къошуму",
"contributions-title": "Ортакъчыны ярдымы $1",
"tooltip-ca-nstab-category": "Категорияны сагьифасына къарамакъ",
"tooltip-minoredit": "Увакъ алышынывдай белгилемек",
"tooltip-save": "Алышдырывларынг сакъламакъ",
+ "tooltip-preview": "Сагьифаны ингкъараву. Сакъълагъанчакъы пайдалан.",
"tooltip-diff": "Сен этген матынны тюзлевлеринг гёрсетмек",
"tooltip-compareselectedversions": "Бу сагьифаны сайлангъан эки тюрлерин башгъалыгъына къарамакъ.",
"tooltip-watch": "Сени тергев сиягьынга бу сагьифаны къошмакъ",
"pageinfo-header-restrictions": "Сагьифа къорув",
"pageinfo-header-properties": "Сагьифа кюйлемлер",
"pageinfo-display-title": "Гёрсетилеген аты",
+ "pageinfo-default-sort": "Бар кюйде айырыв ачгъычы",
"pageinfo-length": "Сагьифаны узунлугъу (байтларда)",
"pageinfo-article-id": "Сагьифа ID",
"pageinfo-language": "Сагьифаны тили",
"show-big-image-other": "Башгъа {{PLURAL:$2|айырым|айырымлар}}: $1.",
"show-big-image-size": "$1 × $2 пиксел",
"metadata": "Мета маълюматлар",
+ "exif-orientation": "Онгарылым",
"exif-xresolution": "Гёнделен айырым",
"exif-yresolution": "Тик айырым",
"exif-datetime": "Сапламны алышыныв тархы ва заманы",
"exif-make": "Камераны ясавчусу",
"exif-model": "Камераны модели",
+ "exif-software": "Програм таъмини",
"exif-exifversion": "Exif тюрю",
"exif-colorspace": "Тюслер аралыгъы",
"exif-datetimeoriginal": "Аслу тарх ва заман",
+ "exif-datetimedigitized": "Санавлашдырывну тархы ва заманы",
"exif-orientation-1": "Нормал",
"namespacesall": "бары да",
"monthsall": "бары да",
"watchlisttools-edit": "Тизмени къарап тюзлемек",
"watchlisttools-raw": "Саяв текстни тюзлемек",
"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|сёйлешив]])",
+ "redirect": "Сапламны, къоллавчуну, сагьифаны, тюрню яда гюнделикни менлигине гёре ёллав",
"redirect-submit": "Гёчмек",
"redirect-lookup": "Излев:",
"redirect-value": "Къыймат:",
"tags-hitcount": "$1 {{PLURAL:$1|алышыныв|алышынывлар}}",
"logentry-delete-delete": "$1 {{GENDER:$2|тайдыргъан}} сагьифаны $3",
"logentry-delete-restore": "$1 бу $3 ($4) сагьифаны {{GENDER:$2ярашдыргъан|}}",
+ "logentry-delete-revision": "$1 бу сагьифаны $3: $4 {{PLURAL:$5|тюрюн}} гёрюнегенлигин {{GENDER:$2|алышдырды}}",
"revdelete-content-hid": "ичделиги яшырылгъан",
"logentry-move-move": "$1 къоллавчу $3 сагьифаны $4 сагьифагъа атын айландыргъан",
+ "logentry-move-move-noredirect": "$1 бу сагьифаны $3 атын бугъар $4 {{GENDER:$2|алышдырды}} онгарывсуз да къойду",
+ "logentry-move-move_redir": "$1 бу сагьифаны $3 атын бугъар $4 {{GENDER:$2|алышдырды}} онгарывсуз да къойду",
+ "logentry-patrol-patrol-auto": "$1 оьзлюгюнден $3 сагьифаны $4 тюрюн патруллангъандай {{GENDER:$2|белгилеген}}",
"logentry-newusers-create": "$2 къоллавчу $1 бетин этген",
+ "logentry-newusers-autocreate": "$1 ортакъчыны гьисабы оьзлюгюнден {{GENDER:$2|яратылды}}",
"logentry-upload-upload": "$1 {{GENDER:$2|юклеген}} $3",
"logentry-upload-overwrite": "$1 буну $3 янгы тюрюн {{GENDER:$2|юклеген}}",
"searchsuggest-search": "{{SITENAME}} ичинде излемек",
"minoreditletter": "м",
"newpageletter": "Ж",
"boteditletter": "б",
- "rc_categories_any": "Каалаган",
"rc-enhanced-expand": "Кошумча маалыматтарды көрсөтүү (JavaScript талап кылынат)",
"rc-enhanced-hide": "Кошумча маалыматтарды жашыруу",
"recentchangeslinked": "Байланыштуу өзгөрүүлөр",
"newpageletter": "N",
"boteditletter": "a",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usor observans|usores observantes}}]",
- "rc_categories_any": "Ulla",
"rc-change-size-new": "$1 {{PLURAL:$1|octetus|octeti}} post recensionem",
"newsectionsummary": "/* $1 */ nova pars",
"rc-enhanced-expand": "Minima monstrare",
"minoreditletter": "ch",
"newpageletter": "M",
"boteditletter": "b",
- "rc_categories_any": "Kualkyer",
"rc-change-size-new": "$1 {{PLURAL:$1|bayt|baytes}} dospués del trocamiento",
"rc-enhanced-expand": "Amostrar los detalios",
"rc-enhanced-hide": "Esconder los detalios",
"newpageletter": "N",
"boteditletter": "B",
"number_of_watching_users_pageview": "[$1 Benotzer {{PLURAL:$1|iwwerwaacht|iwwerwaachen}}]",
- "rc_categories": "Limitéieren op d'Kategorie (getrennt mat \"|\"):",
- "rc_categories_any": "Aus iergendenger vun den erausgesichten",
"rc-change-size": "$1 {{PLURAL:$1|Byte|Bytes}}",
"rc-change-size-new": "$1 {{PLURAL:$1|Byte|Bytes}} no der Ännerung",
"newsectionsummary": "Neien Abschnitt /* $1 */",
"minoreditletter": "гъ",
"newpageletter": "Цl",
"boteditletter": "б",
- "rc_categories_any": "ГЬар са",
"rc-change-size-new": "Масакlа авунилай ахпа кьадар: $1 байт",
"rc-enhanced-expand": "Куьлуь-шуьлуьяр къалурун (JavaScript герекзава)",
"rc-enhanced-hide": "Куьлуь-шуьлуьяр чуьнуьха",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usor|usores}} monitorinte]",
- "rc_categories": "Limita de categorias (separa con \"|\"):",
- "rc_categories_any": "Cualce de la elejedas",
"rc-change-size-new": "$1 {{PLURAL:$1|bait|baites}} pos cambia",
"newsectionsummary": "/* $1 */ parte nova",
"rc-enhanced-expand": "Mostra detalias",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|keer|keer}} op 'ne volglies]",
- "rc_categories": "Bepirk tot categorieë (sjeij mit 'n \"|\")",
- "rc_categories_any": "Idder vanne gekaozene",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} nao verangering",
"newsectionsummary": "/* $1 */ nuje subkop",
"rc-enhanced-expand": "Toean details",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[osservâ da {{PLURAL:$1|un utente|$1 utenti}}]",
- "rc_categories": "Limite a-e categorie (separæ da \"|\"):",
- "rc_categories_any": "Quâ-se-sæ fra quelle indicæ",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} doppo a modiffica",
"newsectionsummary": "/* $1 */ neuva seçion",
"rc-enhanced-expand": "Fanni vedde i detaggi",
"newpageletter": "نو",
"boteditletter": "ر",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کاربر}} پیگیرنده]",
- "rc_categories": "محدود به این ردهها (ردهها را با «|» جدا کنید):",
- "rc_categories_any": "هر کدام از منتخبها",
"rc-change-size-new": " $1دؤما تۀقیر دائن{{PLURAL:$1|بایت|بایتل}}",
"newsectionsummary": "/* $1 */ بەخش نوو",
"rc-enhanced-expand": "نمایش جزئیات",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[tignìda d'öcc de {{PLURAL:$1|1 ütènt|$1 ütèncc}}]",
- "rc_categories_any": "Töcc",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} dopo la mudìfica",
"newsectionsummary": "/* $1 */ sezión növa",
"rc-enhanced-expand": "Fà ved i detai",
"boteditletter": "ب",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 دینه {{PLURAL:$1|کاریار|کاریاریا}}]",
- "rc_categories": "جأرغە یا نە مأدوٙد کو(ڤا \"|\" جئگا بان)",
- "rc_categories_any": "ھأرکوم کئ گولئ ڤورچیە بیینە",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|بایت|بایتیا}} ناٛها آلشتکاری",
"newsectionsummary": "/* $1 */ بهرجا تازه",
"newpageletter": "N",
"boteditletter": "a",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|stebintis naudotojas|stebintys naudotojai|stebinčių naudotojų}}]",
- "rc_categories": "Riboti kategorijoms (atskirkite su „|“)",
- "rc_categories_any": "Bet kuris iš pasirinktųjų",
"rc-change-size-new": "$1 {{PLURAL:$1|baitas|baitai|baitų}} po pakeitimo",
"newsectionsummary": "/* $1 */ naujas skyrius",
"rc-enhanced-expand": "Rodyti detales",
"newpageletter": "T",
"boteditletter": "k",
"number_of_watching_users_pageview": "[$1 hmangtu {{PLURAL:$1||te}} vil mék]",
- "rc_categories": "Pawla bithliahna (\"|\" hmangin kárdan rawh)",
- "rc_categories_any": "Väi",
"rc-change-size-new": "Tihdanglam hnuah {{PLURAL:$1|bait|bait}} $1",
"newsectionsummary": "/* $1 */ hläwm thar",
"rc-enhanced-expand": "Tilang kim rawh (JavaScript a ngai)",
"newpageletter": "J",
"boteditletter": "b",
"number_of_watching_users_pageview": "[šo lapu uzrauga $1 {{PLURAL:$1|dalībnieki|dalībnieks|dalībnieki}}]",
- "rc_categories": "Ierobežot uz kategorijām (atdalīt ar \"|\"):",
- "rc_categories_any": "Jebkas no izvēlētā",
"rc-change-size-new": "$1 {{PLURAL:$1|baiti|baits|baiti}} pēc izmaiņām",
"newsectionsummary": "/* $1 */ jauna sadaļa",
"rc-enhanced-expand": "Skatīt detaļas",
"newpageletter": "新",
"boteditletter": "僕",
"number_of_watching_users_pageview": "[放有$1哨]",
- "rc_categories_any": "任",
"rc-change-size-new": "既纂,本文有$1字節",
"newsectionsummary": "/* $1 */ 新節",
"rc-enhanced-expand": "示細",
"minoreditletter": "çʼ",
"newpageletter": "A",
"boteditletter": "b",
- "rc_categories_any": "Çkar",
"rc-enhanced-expand": "Detayepe ko3ʼiri (JavaScript-i unon)",
"rc-enhanced-hide": "Detayepe doşinaxi",
"recentchangeslinked": "Alakʼali na renan oktirobape",
"boteditletter": "ब",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 ध्यान राखैवाला {{PLURAL:$1|प्रयोक्ता|प्रयोक्तासभ}}]",
- "rc_categories": "श्रेणीसभ धरि सीमीत राखी (\"|\" सँ अलग करी)",
- "rc_categories_any": "कोनो भी चुनिन्दा",
"rc-change-size": "$1",
"rc-change-size-new": "परिवर्तनक बाद $1 {{PLURAL:$1|बाइट}}",
"newsectionsummary": "/* $1 */ नव अनुभाग",
"minoreditletter": "c",
"newpageletter": "A",
"boteditletter": "b",
- "rc_categories": "Batesi gutul kategori (dipisah karo \"|\")",
- "rc_categories_any": "Apa baen",
"newsectionsummary": "/* $1 */ bagiyan anyar",
"rc-enhanced-expand": "Tidokna detile (merlokna JavaScript)",
"rc-enhanced-hide": "Umpetna rincian",
"newpageletter": "О",
"boteditletter": "р",
"number_of_watching_users_pageview": "[$1 ваны {{PLURAL:$1|тии|тиихть}}]",
- "rc_categories": "Аньцек категориеста (явфтомс \"|\" вельде)",
- "rc_categories_any": "Эрь кодама",
"newsectionsummary": "/* $1 */ од пялькс",
"rc-enhanced-expand": "Няфтемс анцяйнятне (эряви JavaScript)",
"rc-enhanced-hide": "Кяшемс анцяйнятне",
"newpageletter": "V",
"boteditletter": "r",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|mpikambana|mpikambana}} manara-maso]",
- "rc_categories": "Ferana amin'ireto sokajy ireto (saraho amin'ny \"|\")",
- "rc_categories_any": "Anisan'ireo nofidiana",
"rc-change-size-new": "$1{{PLURAL:}} oktety taorian'ny fanovana",
"newsectionsummary": "/* $1 */ fizarana vaovao",
"rc-enhanced-expand": "Hijery ny antsipirihany",
"newpageletter": "Н",
"boteditletter": "б",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|корисник што набљудува|корисници што набљудуваат}}]",
- "rc_categories": "Само од категории (одделувајќи со „|“):",
- "rc_categories_any": "Било која од избраните",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|бајт|бајти}} по промената",
"newsectionsummary": "/* $1 */ ново заглавие",
"boteditletter": "(യ.)",
"unpatrolledletter": "(!)",
"number_of_watching_users_pageview": "[{{PLURAL:$1|ഒരു ഉപയോക്താവ്|$1 ഉപയോക്താക്കൾ}} ഈ താൾ ശ്രദ്ധിക്കുന്നുണ്ട്]",
- "rc_categories": "വർഗ്ഗങ്ങളുടെ പരിധി (\"|\" ഉപയോഗിച്ച് പിരിക്കുക):",
- "rc_categories_any": "തിരഞ്ഞെടുത്തതിൽ ഏതെങ്കിലും",
"rc-change-size-new": "മാറ്റത്തിനു ശേഷം {{PLURAL:$1|ഒരു ബൈറ്റ്|$1 ബൈറ്റുകൾ}}",
"newsectionsummary": "/* $1 */ പുതിയ ഉപവിഭാഗം",
"rc-enhanced-expand": "അധികവിവരങ്ങൾ പ്രദർശിപ്പിക്കുക",
"htmlform-user-not-exists": "<strong>$1</strong> നിലവിലില്ല.",
"htmlform-user-not-valid": "<strong>$1</strong> സാധുതയുള്ള ഉപയോക്തൃനാമമല്ല.",
"logentry-delete-delete": "$3 എന്ന താൾ $1 {{GENDER:$2|മായ്ച്ചിരിക്കുന്നു}}",
+ "logentry-delete-delete_redir": " $3 എന്ന തിരിച്ചുവിടൽ, $1, മുകളിൽ ചേർത്തത് വഴി {{GENDER:$2|മായ്ച്ചിരിക്കുന്നു}}",
"logentry-delete-restore": "$3 എന്ന താൾ $1 {{GENDER:$2|പുനഃസ്ഥാപിച്ചിരിക്കുന്നു}} ($4)",
+ "logentry-delete-restore-nocount": "$3 എന്ന താൾ $1 {{GENDER:$2|പുനഃസ്ഥാപിച്ചിരിക്കുന്നു}}",
"restore-count-revisions": "{{PLURAL:$1|ഒരു നാൾപ്പതിപ്പ്|$1 നാൾപ്പതിപ്പുകൾ}}",
"restore-count-files": "{{PLURAL:$1|ഒരു പ്രമാണം|$1 പ്രമാണങ്ങൾ}}",
"logentry-delete-event": "$3 എന്ന {{PLURAL:$5|രേഖയിലെ മാറ്റത്തിന്റെ|രേഖയിലെ $5 മാറ്റങ്ങളുടെ}} ദർശനീയത $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}: $4",
"logentry-protect-protect-cascade": "$3 താൾ $1 {{GENDER:$2|സംരക്ഷിച്ചു}} $4 [നിർഝരിതം]",
"logentry-protect-modify": "$3 താളിന്റെ സംരക്ഷണതലം $1 {{GENDER:$2|മാറ്റി}} $4",
"logentry-protect-modify-cascade": "$3 താളിന്റെ സംരക്ഷണതലം $1 {{GENDER:$2|മാറ്റി}} $4 [നിർഝരിതം]",
- "logentry-rights-rights": "$3 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം, $4 എന്നതിൽ നിന്നു $5 എന്നതിലേക്ക്, $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
+ "logentry-rights-rights": "{{GENDER:$6|$3}} എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം, $4 എന്നതിൽ നിന്നു $5 എന്നതിലേക്ക്, $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
"logentry-rights-rights-legacy": "$3 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
"logentry-rights-autopromote": "$1 എന്ന ഉപയോക്താവ് $4 എന്നതിൽ നിന്നും $5 എന്നതിലേയ്ക്ക് സ്വയമേവ {{GENDER:$2|ഉയർത്തപ്പെട്ടിരിക്കുന്നു}}",
"logentry-upload-upload": "$1 $3 {{GENDER:$2|അപ്ലോഡ് ചെയ്തു}}",
"logentry-tag-update-revision": "$3 എന്ന താളിന്റെ $4 എന്ന നാൾപ്പതിപ്പിൽ ടാഗുകൾ $1 {{GENDER:$2|പുതുക്കി}} ($6 {{PLURAL:$7|ചേർത്തു}}; $8 {{PLURAL:$9|നീക്കംചെയ്തു}})",
"logentry-tag-update-logentry": "$3 എന്ന താളിന്റെ $5 എന്ന രേഖയിലെ ഉൾപ്പെടുത്തലിൽ ടാഗുകൾ $1 {{GENDER:$2|പുതുക്കി}} ($6 {{PLURAL:$7|ചേർത്തു}}; $8 {{PLURAL:$9|നീക്കംചെയ്തു}})",
"rightsnone": "(ഒന്നുമില്ല)",
+ "rightslogentry-temporary-group": "$1 (താത്കാലികം, $2 വരെ)",
"feedback-adding": "താങ്കളുടെ അഭിപ്രായങ്ങൾ താളിലേയ്ക്ക് ചേർക്കുന്നു...",
"feedback-back": "പുറകോട്ട്",
"feedback-bugcheck": "കൊള്ളാം! [$1 അറിയാവുന്ന ബഗുകളിൽ] ഒന്നല്ല എന്ന് ഒന്നു പരിശോധിച്ചേക്കുക.",
"log-action-filter-delete-revision": "നാൾപ്പതിപ്പ് മായ്ക്കൽ",
"log-action-filter-import-interwiki": "ട്രാൻസ്വിക്കി ഇറക്കുമതി",
"log-action-filter-import-upload": "എക്സ്.എം.എൽ. അപ്ലോഡ് വഴിയുള്ള ഇറക്കുമതി",
+ "log-action-filter-protect-protect": "സംരക്ഷണം",
"log-action-filter-protect-unprotect": "സംരക്ഷണമൊഴിവാക്കൽ",
"log-action-filter-protect-move_prot": "സംരക്ഷണം മാറ്റി",
"log-action-filter-suppress-event": "രേഖ ഒതുക്കൽ",
"newpageletter": "Ш",
"boteditletter": "р",
"number_of_watching_users_pageview": "[$1 хэрэглэгч харж байна]",
- "rc_categories": "Ангиллуудад хязгаарлах (\"|\" тэмдгээр тусгаарлана)",
- "rc_categories_any": "Хамаагүй",
"rc-change-size-new": "Өөрчилсний дараа $1 {{PLURAL:$1|байт|байт}}",
"newsectionsummary": "/* $1 */ шинэ хэсэг",
"rc-enhanced-expand": "Дэлгэрэнгүй мэдээллийг үзүүлэх (ЖаваСкрипт хэрэглэгдэнэ)",
"newpageletter": "न.पा.",
"boteditletter": "सां.",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|सदस्याने|सदस्यांनी}} पहारा दिलेला आहे]",
- "rc_categories": "वर्गांपुरते मर्यादित ठेवा (\"|\"ने वेगळे करा):",
- "rc_categories_any": "निवडल्यापैकी कोणतेही",
"rc-change-size-new": " बदलानंतर $1 {{PLURAL:$1|बाईट|बाईटस्}}",
"newsectionsummary": "/* $1 */ नवीन विभाग",
"rc-enhanced-expand": "तपशील दाखवा",
"boteditletter": "b",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 pemantau]",
- "rc_categories": "Hadkan kepada kategori (asingkan dengan \"|\")",
- "rc_categories_any": "Mana-mana yang terpilih",
"rc-change-size": "$1",
"rc-change-size-new": "$1 bait selepas perubahan",
"newsectionsummary": "/* $1 */ bahagian baru",
"newpageletter": "Ġ",
"boteditletter": "b",
"number_of_watching_users_pageview": "[osservat minn {{PLURAL:$1|$1 utent|$1 utent}}]",
- "rc_categories": "Illimita għall-kategoriji (issepara b' \"|\")",
- "rc_categories_any": "Kwalunkwe",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} wara l-modifika",
"newsectionsummary": "/* $1 */ sezzjoni ġdida",
"rc-enhanced-expand": "Uri d-dettalji",
"minoreditletter": "m",
"newpageletter": "N",
"boteditletter": "b",
- "rc_categories_any": "Qualquiera de ls scolhidos",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} açpuis las altaraçones",
"newsectionsummary": "/* $1 */ nuobo cacho",
"rc-enhanced-expand": "Amostrar detailhes",
"newpageletter": "အသစ်",
"boteditletter": "ဘော့",
"number_of_watching_users_pageview": "[စောင့်ကြည့်နေသော အသုံးပြုသူ $1 {{PLURAL:$1|ဦး|ဦး}}]",
- "rc_categories": "ကဏ္ဍများအား ကန့်သတ်ရန် (\"|\" ဖြင့် ခွဲခြား):",
- "rc_categories_any": "ရွေးချယ်ခံရသော မည်သူမဆို",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ပြောင်းလဲပြီးနောက်",
"newsectionsummary": "/* $1 */ အပိုင်းသစ်",
"rc-enhanced-expand": "အသေးစိတ် ပြရန်",
"minoreditletter": "а",
"newpageletter": "О",
"boteditletter": "б",
- "rc_categories_any": "Кочказетнень эйстэ кодамо-понгсь",
"rc-change-size-new": "Полавтнемадонть мейле {{PLURAL:$1|байттнэде}}: $1",
"newsectionsummary": "/* $1 */ од пелькс",
"rc-enhanced-expand": "Невтемс седе ламо тень ланга",
"newpageletter": "Y",
"boteditletter": "T",
"number_of_watching_users_pageview": "[$1 tlatequitiltilīlli {{PLURAL:$1|tlachiya|tlachiyah}}]",
- "rc_categories_any": "Zāzo in tlaihittalli",
"newsectionsummary": "Yancuīc tlahtōltzintli: /* $1 */",
"recentchangeslinked": "Tlapatlaliztli tzonhuilizpan",
"recentchangeslinked-feed": "Tlapatlaliztli tzonhuilizpan",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[osservata 'a {{PLURAL:$1|n'utente|$1 utente}}]",
- "rc_categories": "Lemmeta a 'e categurìe (spartute 'a \"|\"):",
- "rc_categories_any": "Qualunque d' 'e scigliute",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} aropp'ô cagnamiento",
"newsectionsummary": "/* $1 */ sezziona nnova",
"rc-enhanced-expand": "Fa vede dettaglie",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 overvåkende {{PLURAL:$1|bruker|brukere}}]",
- "rc_categories": "Begrens til kategorier (skilletegn: «|»)",
- "rc_categories_any": "Alle",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} etter endring",
"newsectionsummary": "/* $1 */ ny seksjon",
"rc-enhanced-expand": "Vis detaljer",
"boteditletter": "B",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|keer|keer}} op n volglieste]",
- "rc_categories": "Beparking tot kategorieën (scheien mit \"|\")",
- "rc_categories_any": "alles",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} nao de wieziging",
"newsectionsummary": "Niej onderwarp: /* $1 */",
"rc-enhanced-expand": "Details bekieken",
"newpageletter": "N",
"boteditletter": "B",
"number_of_watching_users_pageview": "[{{PLURAL:$1|Een Bruker|$1 Brukers}}, de oppasst]",
- "rc_categories": "Blot Sieden ut de Kategorien (trennt mit „|“):",
- "rc_categories_any": "All",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} achter Ännern",
"newsectionsummary": "/* $1 */ nee Afsnitt",
"rc-enhanced-expand": "Details wiesen (bruukt JavaScript)",
"boteditletter": "बो",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 निगरानी गर्दै{{PLURAL:$1|प्रयोगकर्ता|प्रयोगकर्ताहरु}}]",
- "rc_categories": "श्रेणीहरूमा सीमित (\"|\" ले छुट्याउनुहोस्)",
- "rc_categories_any": "छानिएका कुनै",
"rc-change-size": "$1",
"rc-change-size-new": "परिवर्तनपछि $1 {{PLURAL:$1|बाइट|बाइट}}",
"newsectionsummary": "/* $1 */ नयाँ खण्ड",
"McDutchie",
"Romaine",
"Mainframe98",
- "Mar(c)"
+ "Mar(c)",
+ "Robin van der Vliet"
]
},
"view-pool-error": "De servers zijn op het moment helaas overbelast.\nTe veel gebruikers proberen deze pagina te bekijken.\nWacht even voordat je opnieuw toegang probeert te krijgen tot deze pagina.\n\n$1",
"prefs-help-variant": "Jouw voorkeursvariant of -spelling om de inhoudspagina's van deze wiki in weer te geven.",
"prefs-help-signature": "Reacties op de overlegpagina's worden meestal ondertekend met \"<nowiki>~~~~</nowiki>\".\nDe tildes worden omgezet in je ondertekening en een datum en tijd van de bewerking.",
"badsiglength": "Je ondertekening is te lang.\nDeze moet minder dan $1 {{PLURAL:$1|teken|tekens}} bevatten.",
+ "gender-unknown": "De software gebruikt waar mogelijk geslachtsneutrale woorden als het over je gaat",
"prefs-help-realname": "Echte naam is optioneel.\nAls je deze opgeeft, kan deze naam gebruikt worden om je erkenning te geven voor je werk.",
"prefs-help-email": "E-mailadres is optioneel, maar maakt het mogelijk om jou je wachtwoord te e-mailen als je het bent vergeten.",
"prefs-help-email-others": "Je kunt ook anderen in staat stellen per e-mail contact met je op te nemen via een koppeling op uw gebruikers- en overlegpagina zonder dat je je identiteit prijsgeeft.",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|keer|keer}} op een volglijst]",
- "rc_categories": "Beperken tot categorieën (scheiden met een \"|\"):",
- "rc_categories_any": "Een van de gekozen",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} na de wijziging",
"newsectionsummary": "/* $1 */ nieuwe subkop",
"rc-enhanced-expand": "Details weergeven",
"newpageletter": "n",
"boteditletter": "b",
"number_of_watching_users_pageview": "[{{PLURAL:$1|Éin brukar|$1 brukarar}} overvakar]",
- "rc_categories": "Avgrens til kategoriar (skil med «|»):",
- "rc_categories_any": "Alle",
"rc-change-size-new": "$1 {{PLURAL:$1|byte}} etter endringa",
"newsectionsummary": "/* $1 */ ny bolk",
"rc-enhanced-expand": "Vis detaljar",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|utilizaire seguent|utilizaires seguents}}]",
- "rc_categories": "Limitar a las categorias (separadas per « | ») :",
- "rc_categories_any": "Una de las seleccionadas",
"rc-change-size-new": "$1 {{PLURAL:$1|octet|octets}} aprèp cambiament",
"newsectionsummary": "/* $1 */ seccion novèla",
"rc-enhanced-expand": "Vejatz los detalhs",
"newpageletter": "ନୂଆ",
"boteditletter": "ବଟ",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|ସଭ୍ୟ|ସଭ୍ୟଗଣା}}ଙ୍କୁ ଦେଖୁଅଛି]",
- "rc_categories": "ଶ୍ରେଣୀସମୂହ ପାଇଁ ସୀମା ( \"|\" ଦେଇ ଅଲଗା କରିବେ)",
- "rc_categories_any": "ଯେ କୌଣସି",
"rc-change-size-new": "ବଦଳ ପରେ $1 {{PLURAL:$1|ବାଇଟ|ବାଇଟସବୁ}}",
"newsectionsummary": "/* $1 */ ନୂଆ ଭାଗ",
"rc-enhanced-expand": "ସବିଶେଷ ଦେଖାନ୍ତୁ",
"minoreditletter": "ч",
"newpageletter": "Н",
"boteditletter": "б",
- "rc_categories_any": "Кæцы фæнды",
"newsectionsummary": "/* $1 */ ног хай",
"rc-enhanced-expand": "Лæмбынæг информаци равдисын",
"rc-enhanced-hide": "Айсын лæмбынæг информаци",
"newpageletter": "ਨ",
"boteditletter": "ਬੋਟ",
"number_of_watching_users_pageview": "[$1 ਵੇਖ ਰਹੇ ਹਨ {{PLURAL:$1|ਯੂਜ਼ਰ}}]",
- "rc_categories_any": "ਚੁਣੇ ਹੋਇਅਾਂ ਵਿੱਚੋਂ ਕੋਈ ਵੀ",
"rc-change-size-new": "$1 {{PLURAL:$|ਬਾਈਟ|ਬਾਈਟਾਂ}} ਤਬਦੀਲੀ ਤੋਂ ਬਾਅਦ",
"newsectionsummary": "/* $1 */ ਨਵਾਂ ਭਾਗ",
"rc-enhanced-expand": "ਵੇਰਵੇ ਵੇਖਾਓ",
"newpageletter": "B",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 lalbe {{PLURAL:$1|talagamit|talagamit}}]",
- "rc_categories": "Angganan/limitasiun da reng kategoriya (pikawani la king \"|\")",
- "rc_categories_any": "Andyang sanu",
"newsectionsummary": "/* $1 */ bayung seksiyon/dake",
"rc-enhanced-expand": "Pakit la reng detalle (mangailangan yang JavaScript)",
"rc-enhanced-hide": "Isalikut la reng detalle",
"minoreditletter": "g",
"newpageletter": "N",
"boteditletter": "W",
- "rc_categories_any": "All",
"rc-change-size-new": "$1 {{PLURAL:$1|Beit|Beit}} nooch daer Ennering",
"newsectionsummary": "Neier Abschnitt /* $1 */",
"recentchangeslinked": "Was on verlinkde Bledder geduh warre iss",
"minoreditletter": "k",
"newpageletter": "N",
"boteditletter": "B",
- "rc_categories": "Oigschrengd uff Sachgrubbe (abgdeeld middm \"|\")",
- "rc_categories_any": "Ebbes",
"rc-change-size-new": "$1 {{PLURAL:$1|Byte}} nochde Ännarung",
"rc-enhanced-expand": "Änzlhaide zaische",
"rc-enhanced-hide": "Oagawe vaschdeggle",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|obserwujący użytkownik|obserwujących użytkowników}}]",
- "rc_categories": "Ogranicz do kategorii (oddzielaj za pomocą „|”)",
- "rc_categories_any": "Dowolna z wybranych",
"rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajty|bajtów}} po zmianie",
"newsectionsummary": "/* $1 */ nowa sekcja",
"rc-enhanced-expand": "Pokaż szczegóły",
"newpageletter": "N",
"boteditletter": "t",
"number_of_watching_users_pageview": "[tnùa sot-euj da {{PLURAL:$1|n'utent|$1 utent}}]",
- "rc_categories": "Limité a le categorìe (che a jë scriva separand-je antra 'd lor con un \"|\"):",
- "rc_categories_any": "Un-a qualsëssìa ëd cole selessionà",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} apress ij cambi",
"newsectionsummary": "/* $1 */ session neuva",
"rc-enhanced-expand": "Mostré ij detaj",
"newpageletter": "نواں",
"boteditletter": "بوٹ",
"number_of_watching_users_pageview": "[ $1 ویکھ رہیا اے{{PLURAL:$1|ورتن والا|والے}}]",
- "rc_categories": "گٹھاں دی حد (وکھرے کرو \"|\")",
- "rc_categories_any": "کوئی",
"rc-change-size-new": "$1 {{PLURAL:$1|بائٹ|بائٹاں}} تبدیلی مگروں",
"newsectionsummary": "/* $1 */ نواں پاسہ",
"rc-enhanced-expand": "تفضیل وکھاؤ (جاوا سکرپٹ چائیدا اے)",
"minoreditletter": "μ",
"newpageletter": "Ν",
"boteditletter": "b",
- "rc_categories_any": "Κάθαν",
"rc-enhanced-expand": "Δείξον λεπτομέρειας (θελ' JavaScript)",
"rc-enhanced-hide": "Κρύψον λεπτομέρειας",
"recentchangeslinked": "Σχετικά αλλαγάς",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|nadirīnts tērpautajs|nadirīntei tērpautajai}}]",
- "rc_categories": "Arāikinais prei kategōrijan (izsklaitinnais sen \"|\")",
- "rc_categories_any": "Wisāi",
"newsectionsummary": "/* $1 */ naunā sekciōni",
"rc-enhanced-expand": "Waidinnais malkans (izkīnina JavaScript)",
"rc-enhanced-hide": "Kliptinais malkans",
"boteditletter": "ر",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کتونکی کارن|کتونکي کارنان}}]",
- "rc_categories": "د وېشنيزو تر بريده (په \"|\" بېلول)",
- "rc_categories_any": "له ټاکل شويو هر يو",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|بايټ|بايټونه}} د بدلون وروسته",
"newsectionsummary": "/* $1 */ نوې برخه",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[{{PLURAL:$1|$1 usuário|$1 usuários}} vigiando]",
- "rc_categories": "Limitar às categorias (separar com \"|\"):",
- "rc_categories_any": "Qualquer um dos escolhidos",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} após alterações",
"newsectionsummary": "/* $1 */ nova seção",
"rc-enhanced-expand": "Exibir detalhes",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[{{PLURAL:$1|$1 utilizador|$1 utilizadores}} a vigiar]",
- "rc_categories": "Limitar às categorias (separar com \"|\"):",
- "rc_categories_any": "Qualquer dos escolhidos",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} após mudança",
"newsectionsummary": "/* $1 */ nova secção",
"rc-enhanced-expand": "Mostrar detalhes",
"unpatrolledletter": "{{optional}}\n\nUsed in {{msg-mw|Recentchanges-label-legend}}, meaning \"unpatrolled\".",
"number_of_watching_users_RCview": "{{notranslate}}\nParameters:\n* $1 - number of users who are watching",
"number_of_watching_users_pageview": "Used if <code>$wgPageShowWatchingUsers</code> is true.\n* $1 - number of watching user(s)",
- "rc_categories": "A label of an input box. Appears on Special:RecentChanges if filtering recent changes by category is enabled (that is, $wgAllowCategorizedRecentChanges is set to true).",
- "rc_categories_any": "Appears ''after'' the input box the label of which is {{msg-mw|rc_categories}}, which appears on [[Special:RecentChanges]], if <code>$wgAllowCategorizedRecentChanges</code> is true. \"Chosen\" refers to categories.",
"rc-change-size": "{{optional}}\nDoes not work under $wgMiserMode ([[mwr:48986|r48986]]).\n\nParameters:\n* $1 - size of diff",
"rc-change-size-new": "Tooltip when hovering a change list diff size. Parameters:\n* $1 - the resulting new size (in bytes)",
"newsectionsummary": "Default summary when adding a new section to a page. Parameters:\n* $1 - section title",
"newpageletter": "M",
"boteditletter": "r",
"number_of_watching_users_pageview": "[$1 watiqachkaq {{PLURAL:$1|ruraq|ruraqkuna}}]",
- "rc_categories": "Kay katiguriyakunaman saywachay (\"|\" nisqawan rakisqa)",
- "rc_categories_any": "Imallapas",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} hukchasqa kaptinña",
"newsectionsummary": "Musuq raki: /* $1 */",
"rc-enhanced-expand": "Imaymanachakunata rikuchiy",
"newpageletter": "N",
"boteditletter": "B",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|utilisader|utilisaders}} observeschan quest artitgel]",
- "rc_categories": "Be paginas ord las categorias (seperar cun \"|\")",
- "rc_categories_any": "Tuts",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} suenter la midada",
"newsectionsummary": "Nov chapitel /* $1 */",
"rc-enhanced-expand": "Mussar detagls",
"boteditletter": "b",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|utilizator|utilizatori|de utilizatori}} care urmăresc]",
- "rc_categories": "Limitează la categoriile (separate prin „|”):",
- "rc_categories_any": "Oricare dintre cele alese",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|octet|octeți|de octeți}} după modificare",
"newsectionsummary": "/* $1 */ secțiune nouă",
"boteditletter": "b",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|utende|utinde}} ca condrollene]",
- "rc_categories": "Limite de le categorije (separate cu \"|\")",
- "rc_categories_any": "Qualsiasi de le scacchiate",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} apprisse 'u cangiamende",
"newsectionsummary": "/* $1 */ seziona nove",
"boteditletter": "б",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|наблюдающий участник|наблюдающих участника|наблюдающих участников}}]",
- "rc_categories": "Только из категорий (разделитель «|»):",
- "rc_categories_any": "Любая из выбранных",
"rc-change-size-new": "Размер после изменения: $1 {{PLURAL:$1|байт|байта|байт}}",
"newsectionsummary": "/* $1 */ новая тема",
"rc-enhanced-expand": "Показать подробности",
"newimages-newbies": "Показать только вклад, сделанный с новых учётных записей",
"newimages-showbots": "Показать загрузки ботов",
"newimages-hidepatrolled": "Скрыть отпатрулированные загрузки",
- "newimages-mediatype": "Ð\9cедиа Ñ\82ип:",
+ "newimages-mediatype": "Тип медиаÑ\84айла:",
"noimages": "Изображения отсутствуют.",
"gallery-slideshow-toggle": "Переключить миниатюры",
"ilsubmit": "Найти",
"specialpages-group-other": "Другие служебные страницы",
"specialpages-group-login": "Представиться / Зарегистрироваться",
"specialpages-group-changes": "Свежие правки и журналы",
- "specialpages-group-media": "Отчёты о медиа-материалах и загрузка",
+ "specialpages-group-media": "Отчёты о медиаматериалах и загрузка",
"specialpages-group-users": "Участники и права",
"specialpages-group-highuse": "Интенсивно используемые страницы",
"specialpages-group-pages": "Списки страниц",
"default-skin-not-found-no-skins": "Упс! Тема оформления по умолчанию для вашей вики <code>$wgDefaultSkin</code>, <code>$1</code> недоступна.\n\nУ вас нет установленных тем оформления.\n\n; Если вы только что установили или обновили MediaWiki:\n: Вы, видимо, сделали это с Git или непосредственно из исходного кода с использованием другого способа. Тогда такое возможно. MediaWiki версии 1.24 и новее не содержат темы оформления в основном репозитории. Попробуйте установить некоторые темы из [https://www.mediawiki.org/wiki/Category:All_skins каталога тем оформления сайта mediawiki.org]:\n:* скачав [https://www.mediawiki.org/wiki/Download архив установочных файлов], который содержит несколько тем оформления и расширений; вы можете скопировать папку <code>skins/</code> из него;\n:* скачав архивы отдельных тем оформления с [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org];\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins использовав Git для загрузки тем оформления].\n: Это не должно навредить вашему репозиторию Git, если вы разработчик MediaWiki. См. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] с информацией о том, как включить темы оформления и выбрать тему по умолчанию.",
"default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (включено)",
"default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>отключено</strong>)",
- "mediastatistics": "Ð\9cедиа-Ñ\81Ñ\82аÑ\82иÑ\81Ñ\82ика",
+ "mediastatistics": "СÑ\82аÑ\82иÑ\81Ñ\82ика медиа",
"mediastatistics-summary": "Статистические данные о типах загруженных файлов. Она включает информацию только о последних версиях файлов. Более старые или удалённые версии файлов не учитываются.",
"mediastatistics-nfiles": "$1 ($2%)",
"mediastatistics-nbytes": "$1 {{PLURAL:$1|байт|байта|байт}} ($2; $3%)",
"newpageletter": "Н",
"boteditletter": "б",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|слїдуючій хоснователь|слїдуючі хоснователї|слїдуючіх хоснователїв}}]",
- "rc_categories": "Лем з катеґорій (роздїлёвач «|»)",
- "rc_categories_any": "Будь-якый",
"rc-change-size-new": "$1 {{PLURAL:$1|байтt|байты|байтів}} по змінї",
"newsectionsummary": "/* $1 */ нова секція",
"rc-enhanced-expand": "Вказати детайлы",
"newpageletter": "(नवीनम्)",
"boteditletter": "(बोट्)",
"number_of_watching_users_pageview": "[$1 अवलोकयति {{PLURAL:$1|सदस्यः|सदस्याः}}]",
- "rc_categories": "वर्गान् नियतीकरोतु ।",
- "rc_categories_any": "कश्चित्",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} परिवर्तनपश्चात् ।",
"newsectionsummary": "/* $1 */ नवीनविभागः",
"rc-enhanced-expand": "विवरणानि दृश्यन्ताम्",
"newpageletter": "С",
"boteditletter": "р",
"number_of_watching_users_pageview": "[$1 кэтиир {{PLURAL:$1|кыттааччы|кыттааччылар}}]",
- "rc_categories": "Бу эрэ категориялартан (араарар бэлиэ \"|\")",
- "rc_categories_any": "Талыллыбыттан хайата баҕарар",
"rc-change-size-new": "Уларытыы кээмэйэ: $1 баайт",
"newsectionsummary": "/* $1 */ саҥа сиэксийэ",
"rc-enhanced-expand": "Сиһилии көрдөр",
"minoreditletter": "m",
"newpageletter": "N",
"boteditletter": "b",
- "rc_categories_any": "Calesisiat",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} a pustis de sa modìfica",
"newsectionsummary": "/* $1 */ setzione noa",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[taliata di {{PLURAL:$1|nu utenti|$1 utenti}}]",
- "rc_categories": "Lìmita a li catigurìi (spartuti cu «|»)",
- "rc_categories_any": "Qualegghiè tra chiddi scigghiuti",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} appressu dû canciamentu",
"newsectionsummary": "/* $1 */ sizzioni nova",
"rc-enhanced-expand": "Ammustra li dittagghî",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 watchin {{PLURAL:$1|uiser|uisers}}]",
- "rc_categories": "Leemit tae categories (separate wi \"|\"):",
- "rc_categories_any": "Ony o the chosen",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} efter chynge",
"newsectionsummary": "/* $1 */ new section",
"rc-enhanced-expand": "Shaw details",
"boteditletter": "گ",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|واپرائيندڙ|واپرائيندڙن}} کي نظر ۾ رکندي]",
- "rc_categories_any": "چونڊيلن مان ڪو بہ",
"rc-change-size-new": "$1 {{PLURAL:$1|بائيٽ|بائيٽس}} تبديليءَ کانپوءِ",
"newsectionsummary": "/* $1 */ نئون سيڪشن",
"rc-enhanced-expand": "تفصيل ڏيکاريو",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[abbaidadda da {{PLURAL:$1|un'utenti|$1 utenti}}]",
- "rc_categories": "Limita a li categuri (siparaddi da \"|\")",
- "rc_categories_any": "Cassisia",
"newsectionsummary": "/* $1 */ noba sezzioni",
"rc-enhanced-expand": "Musthrà dettagli (dumanda JavaScript)",
"rc-enhanced-hide": "Cua dettàgli",
"minoreditletter": "u",
"newpageletter": "O",
"number_of_watching_users_pageview": "[$1 čuovvujeaddji geavaheaddji]",
- "rc_categories": "Beare luohkáin (earuheaddji lea ”|”)",
- "rc_categories_any": "Mii beare",
"recentchangeslinked": "Dán siiddu varas rievdadusat",
"recentchangeslinked-feed": "Dán siiddu varas rievdadusat",
"recentchangeslinked-toolbox": "Dán siiddu varas rievdadusat",
"newpageletter": "H",
"boteditletter": "R",
"number_of_watching_users_pageview": "[$1 cait(o/ó)m cáminot]",
- "rc_categories": "Limitde cayliíb (separatman \"|\" mii)",
- "rc_categories_any": "Jömde pac",
"newsectionsummary": "/* $1 */ hunseccion",
"recentchangeslinked": "Quiix hámíigonix",
"recentchangeslinked-feed": "Quiix hámíigonix",
"boteditletter": "b",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 goo ma {{PLURAL:$1|goykaa|goykey}} guna]",
- "rc_categories": "Kayandi dumey ga (i fay nda \"|\")",
- "rc_categories_any": "Affoo kul",
"rc-change-size": "$1",
"rc-change-size-new": "{{PLURAL:$1|cebsi}} $1 barmaa banda ga",
"newsectionsummary": "/* $1 */ dunbu taaga",
"newpageletter": "N",
"boteditletter": "r",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|keravuojontis nauduotuos|keravuojontīs nauduotuojē|keravuojontiu nauduotuoju}}]",
- "rc_categories": "Ruodītė tėk tas kateguorėjės (atskirkat nauduojont „|“)",
- "rc_categories_any": "Bikuokė",
"rc-change-size-new": "$1 {{PLURAL:$1|baits|baitā|baitu}} pu pakeitėma",
"newsectionsummary": "/* $1 */ naus skėrsnelis",
"rc-enhanced-expand": "Ruodītė smolkmenas",
"newpageletter": "N/Н",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|korisnik|korisnika}} koji pregledaju]",
- "rc_categories": "Ograniči na kategorije (razdvoji sa \"|\"):",
- "rc_categories_any": "Bilo koju odabranu",
"rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} posle izmene",
"newsectionsummary": "/* $1 */ nova sekcija",
"rc-enhanced-expand": "Pokaži detalje",
"feedback-subject": "Tema:",
"feedback-submit": "Unesi",
"feedback-thanks": "Hvala! Vaša povratna informacija je postavljena na stranicu „[$2 $1]“.",
- "searchsuggest-search": "Traži",
+ "searchsuggest-search": "Traži {{GRAMMAR:akuzativ|{{SITENAME}}}}",
"searchsuggest-containing": "sadrži...",
"api-error-badtoken": "Unutrašnja greška: token nije ispravan.",
"api-error-emptypage": "Stvaranje novih praznih stranica nije dozvoljeno.",
"boteditletter": "ⴱ",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 iżŗi {{PLURAL:$1|amsqdac|imsqdacn}}]",
- "rc_categories_any": "wanna",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|ⴱⴰⵢⵜ|ⵉⴷ ⴱⴰⵢⵜ}} ⴷⴼⴼⵉⵔ ⵏ ⵓⵙⵏⴼⵍ",
"newsectionsummary": "/* $1 */ ⵜⵉⴳⵣⵎⵉ ⵜⴰⵎⴰⵢⵏⵓⵜ",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 ပႂ်ႉတူၺ်း {{PLURAL:$1|ၽူႈၸႂ်ႉတိုဝ်း|ၽူႈၸႂ်ႉတိုဝ်းၶဝ်}}]",
- "rc_categories_any": "လိူၵ်ႈသေဢၼ်ဢၼ်",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ဝၢႆးသေလႅၵ်ႈလၢႆႈ",
"newsectionsummary": "/* $1 */ ၵၼ်ဢၼ်မႂ်ႇ",
"rc-enhanced-expand": "ၼႄပၼ် ႁူဝ်ယွႆႈမၼ်း",
"newpageletter": "නව",
"boteditletter": "රොබෝ",
"number_of_watching_users_pageview": "[ {{PLURAL:$1| එක් පරිශීලකයෙක් මුර-කරයි|පරිශීලකවරුන් $1 ක් මුර-කරති}} ]",
- "rc_categories": "ප්රවර්ගයන්ට සීමා කරන්න (\"|\" මගින් වෙන් කරන්න):",
- "rc_categories_any": "තෝරාගත් ඕනෑම එකක්",
"rc-change-size": "$1",
"rc-change-size-new": "වෙනස් කළ පසු {{PLURAL:$1|බයිට|බයිටයන්}} $1 ක්",
"newsectionsummary": "/* $1 */ නව ඡේදය",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|sledujúci používateľ|sledujúci používatelia|sledujúcich používateľov}}]",
- "rc_categories": "Obmedziť na kategórie (oddeľte znakom „|“)",
- "rc_categories_any": "Akékoľvek z vybraných",
"rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajty|bajtov}} po zmene",
"newsectionsummary": "/* $1 */ nová sekcia",
"rc-enhanced-expand": "Zobraziť podrobnosti",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[temo {{PLURAL:$1|spremlja|spremljata|spremljajo|spremlja|spremlja}} $1 {{PLURAL:$1|uporabnik|uporabnika|uporabniki|uporabnikov|uporabnikov}}]",
- "rc_categories": "Omejitev na kategorije (ločite jih z »|«):",
- "rc_categories_any": "Katera koli od izbranih",
"rc-change-size-new": "po spremembi: $1 {{PLURAL:$1|zlog|zloga|zlogi|zlogov}}",
"newsectionsummary": "/* $1 */ nov razdelek",
"rc-enhanced-expand": "Pokaži podrobnosti",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|beobachtender|beobachtende}} Nutzer]",
- "rc_categories": "Ock Seyta aus dann Kategorien (getrennt miet „|“):",
- "rc_categories_any": "Olle",
"newsectionsummary": "Neuer Obschnitt /* $1 */",
"rc-enhanced-expand": "Details oazeega (beneetigt JavaScript)",
"rc-enhanced-hide": "Details verstecka",
"minoreditletter": "y",
"newpageletter": "C",
"boteditletter": "b",
- "rc_categories": "Wuxuu u gaar yahay qeybaha (u kala qeybsan \"|\")",
"rc-enhanced-expand": "Itus ka hadalka (waxaa loo baahanyahay JavaScript)",
"rc-enhanced-hide": "Qari ka hadalka",
"recentchangeslinked": "Isbedelada la'xiriira",
"thu": "Enj",
"fri": "Pre",
"sat": "Sht",
- "january": "Janar",
- "february": "Shkurt",
- "march": "Mars",
- "april": "Prill",
- "may_long": "Maj",
- "june": "Qershor",
- "july": "Korrik",
- "august": "Gusht",
- "september": "Shtator",
- "october": "Tetor",
- "november": "Nëntor",
- "december": "Dhjetor",
- "january-gen": "Janar",
- "february-gen": "Shkurt",
- "march-gen": "Mars",
- "april-gen": "Prill",
- "may-gen": "Maj",
- "june-gen": "Qershor",
- "july-gen": "Korrik",
- "august-gen": "Gusht",
- "september-gen": "Shtator",
- "october-gen": "Tetor",
- "november-gen": "Nëntor",
- "december-gen": "Dhjetor",
+ "january": "janar",
+ "february": "shkurt",
+ "march": "mars",
+ "april": "prill",
+ "may_long": "maj",
+ "june": "qershor",
+ "july": "korrik",
+ "august": "gusht",
+ "september": "shtator",
+ "october": "tetor",
+ "november": "nëntor",
+ "december": "dhjetor",
+ "january-gen": "janar",
+ "february-gen": "shkurt",
+ "march-gen": "mars",
+ "april-gen": "prill",
+ "may-gen": "maj",
+ "june-gen": "qershor",
+ "july-gen": "korrik",
+ "august-gen": "gusht",
+ "september-gen": "shtator",
+ "october-gen": "tetor",
+ "november-gen": "nëntor",
+ "december-gen": "dhjetor",
"jan": "Jan",
"feb": "Shk",
"mar": "Mar",
"newpageletter": "R",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 duke u mbikqyrur nga {{PLURAL:$1|përdorues|përdorues}}]",
- "rc_categories": "Kufizimi i kategorive (të ndara me \"|\")",
- "rc_categories_any": "Ndonjë nga të zgjedhurat",
"rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajtë}} pas ndryshimit",
"newsectionsummary": "/* $1 */ seksion i ri",
"rc-enhanced-expand": "Trego detajet",
"tog-watchrollback": "Додај странице на којима сам вратио измене у мој списак надгледања",
"tog-minordefault": "Означавај све измене као мање",
"tog-previewontop": "Прикажи претпреглед пре оквира за уређивање",
- "tog-previewonfirst": "Прикажи преглед на првој измени",
+ "tog-previewonfirst": "Прикажи претпреглед на првој измени",
"tog-enotifwatchlistpages": "Пошаљи ми имејл када се страница или датотека коју надгледам измени",
"tog-enotifusertalkpages": "Пошаљи ми имејл када се моја страница за разговор измени",
"tog-enotifminoredits": "Пошаљи ми имејл и за мање измене страница и датотека",
"tog-watchlisthideminor": "Сакриј мање измене са списка надгледања",
"tog-watchlisthideliu": "Сакриј измене пријављених корисника са списка надгледања",
"tog-watchlistreloadautomatically": "Аутоматски освежи списак надгледања кад год се филтер измени (потребан JavaScript)",
- "tog-watchlistunwatchlinks": "Додај везе за директно додавање/уклањање ставки са списка надгледања (потребан ЈаваСкрипт)",
+ "tog-watchlistunwatchlinks": "Додај везе за директно додавање/уклањање ставки са списка надгледања (потребан JavaScript)",
"tog-watchlisthideanons": "Сакриј измене анонимних корисника са списка надгледања",
"tog-watchlisthidepatrolled": "Сакриј патролиране измене са списка надгледања",
"tog-watchlisthidecategorization": "Сакриј категоризацију страница",
"underline-always": "Увек",
"underline-never": "Никад",
"underline-default": "Према теми или прегледачу",
- "editfont-style": "Ð\98зглед Ñ\84онÑ\82а Ñ\83 Ñ\83Ñ\80еÑ\92иваÑ\87ком оквиÑ\80Ñ\83:",
+ "editfont-style": "СÑ\82ил Ñ\84онÑ\82а Ñ\83 оквиÑ\80Ñ\83 за Ñ\83Ñ\80еÑ\92иваÑ\9aе:",
"editfont-monospace": "Сразмерно широк фонт",
"editfont-sansserif": "Бесерифни фонт",
"editfont-serif": "Серифни фонт",
"oct": "окт",
"nov": "нов",
"dec": "дец",
- "january-date": "$1 јануар",
- "february-date": "$1 фебруар",
- "march-date": "$1 март",
- "april-date": "$1 април",
- "may-date": "$1 мај",
- "june-date": "$1 јун",
- "july-date": "$1 јул",
- "august-date": "$1 август",
- "september-date": "$1 септембар",
- "october-date": "$1 окотобар",
- "november-date": "$1 новембар",
- "december-date": "$1 децембар",
+ "january-date": "$1. јануар",
+ "february-date": "$1. фебруар",
+ "march-date": "$1. март",
+ "april-date": "$1. април",
+ "may-date": "$1. мај",
+ "june-date": "$1. јун",
+ "july-date": "$1. јул",
+ "august-date": "$1. август",
+ "september-date": "$1. септембар",
+ "october-date": "$1. окотобар",
+ "november-date": "$1. новембар",
+ "december-date": "$1. децембар",
"period-am": "преподне",
"period-pm": "поподне",
"pagecategories": "{{PLURAL:$1|Категорија|Категорије|Категорија}}",
"noindex-category": "Непописане странице",
"broken-file-category": "Странице с неисправним везама до датотека",
"about": "О нама",
- "article": "СÑ\82Ñ\80аниÑ\86а Ñ\81а Ñ\81адÑ\80жаÑ\98ем",
+ "article": "Чланак",
"newwindow": "(отвара се у новом прозору)",
"cancel": "Откажи",
"moredotdotdot": "Више…",
"navigation-heading": "Навигациони мени",
"errorpagetitle": "Грешка",
"returnto": "Назад на $1.",
- "tagline": "Из {{SITENAME}}",
+ "tagline": "Извор: {{SITENAME}}",
"help": "Помоћ",
"search": "Претражи",
- "search-ignored-headings": "#<!-- ову линију оставите онакву каква јесте --> <pre>\n# Наслови који ће бити игнорисани упитом\n# Промене су видљиве одмах након што страница са насловом буде пописана\n# Можете изнудити поновно пописивање са \"нулл\" променом\n# Синтакса је следећа:\n# * Свака врста која започиње \"#\" знаком па све до краја је коментар\n# * Свака не празна врста је тачан наслов за занемарити, у тачном облику\nРеференце\nСпољашње везе\nПогледајте\n#</pre> <!-- ову линију оставите онакву каква јесте -->",
+ "search-ignored-headings": " #<!-- не мењајте ништа у овом реду --> <pre>\n# Наслови који ће бити занемарени при претрази.\n# Измене су видљиве одмах након што се страница са насловом попише.\n# Можете изнудити поновно пописивање „нултом” изменом.\n# Синтакса је следећа:\n# * Сваки ред који започиње знаком „#” је коментар.\n# * Сваки не празни ред је тачан наслов који ће бити занемарен, с тим да се разликују мала и велика слова и све остало\nРеференце\nСпољашње везе\nТакође погледајте\n #</pre> <!-- не мењајте ништа у овом реду -->",
"searchbutton": "Претражи",
"go": "Иди",
"searcharticle": "Иди",
"cannotloginnow-title": "Пријава тренутно није могућа",
"cannotloginnow-text": "Пријава није могућа када се користи $1.",
"cannotcreateaccount-title": "Отварање налога није могуће",
+ "cannotcreateaccount-text": "Директно прављење налога није омогућено на овом викију.",
"yourdomainname": "Домен:",
"password-change-forbidden": "Не можете да промените лозинку на овом викију.",
"externaldberror": "Дошло је до грешке при препознавању базе података или немате овлашћења да ажурирате свој спољни налог.",
"createacct-email-ph": "Унесите Вашу имејл адресу",
"createacct-another-email-ph": "Унесите имејл адресу",
"createaccountmail": "Користите привремену, случајно створену лозинку и пошаљите на наведену имејл адресу",
+ "createaccountmail-help": "Може се користити да се некоме направи налог без сазнања лозинке.",
"createacct-realname": "Право име (необавезно)",
"createacct-reason": "Разлог",
"createacct-reason-ph": "Зашто правите још један налог?",
+ "createacct-reason-help": "Порука која се приказује у дневнику стварања корисничких налога",
"createacct-submit": "Отвори налог",
"createacct-another-submit": "Отвори налог",
"createacct-continue-submit": "Наставите отварање налога",
"botpasswords-label-cancel": "Откажи",
"botpasswords-label-delete": "Обриши",
"botpasswords-label-resetpassword": "Ресетуј лозинку",
+ "botpasswords-label-grants": "Применљиве дозволе:",
"botpasswords-label-grants-column": "Одобрено",
"botpasswords-bad-appid": "„$1” није исправан назив бота.",
"botpasswords-insert-failed": "Неуспешно додавање бота \"$1\". Да ли је већ додат?",
"recentchangesdays-max": "Највише $1 {{PLURAL:$1|дан|дана}}",
"recentchangescount": "Број измена за приказ:",
"prefs-help-recentchangescount": "Подразумева скорашње измене, историје страница и дневнике.",
- "prefs-help-watchlist-token2": "Ово је тајни кључ за веб-довод Вашег списка надгледања. \nСвако ко зна овај кључ биће у могућности да види Ваша списак надгледања, зато кључ немојте одавати никоме. \nАко је потребно, кључ [[Special:ResetTokens|можете ресетовати]].",
+ "prefs-help-watchlist-token2": "Ово је тајни кључ за веб-довод Вашег списка надгледања. \nСвако ко зна овај кључ биће у могућности да види Ваш списак надгледања, зато кључ немојте одавати никоме. \nАко је потребно, кључ [[Special:ResetTokens|можете ресетовати]].",
"savedprefs": "Ваша подешавања су сачувана.",
"savedrights": "Корисничке групе за {{GENDER:$1|$1}} су сачуване.",
"timezonelegend": "Временска зона:",
"email-blacklist-label": "Онемогући следећим корисницима да ми шаљу имејлове:",
"prefs-searchoptions": "Претрага",
"prefs-namespaces": "Именски простори",
- "default": "подÑ\80азÑ\83мевано",
+ "default": "подÑ\80азÑ\83мевана",
"prefs-files": "Датотеке",
"prefs-custom-css": "Прилагођени CSS",
"prefs-custom-js": "Прилагођени јаваскрипт",
"grant-group-file-interaction": "Уређивање датотека",
"grant-group-watchlist-interaction": "Уређивање вашег списка надгледања",
"grant-group-email": "Пошаљи имејл",
+ "grant-group-high-volume": "Извршавање великог броја радњи",
+ "grant-group-customization": "Прилагођавање и подешавања",
+ "grant-group-administration": "Извршавање административних радњи",
+ "grant-group-private-information": "Приступање Вашим личним подацима",
"grant-group-other": "Разне активности",
"grant-blockusers": "Блокирање и деблокирање корисника",
"grant-createaccount": "Отварање налога",
"grant-editpage": "Уређивање постојећих страница",
"grant-editprotected": "Уређивање заштићених страница",
"grant-highvolume": "Масовно уређивање",
+ "grant-oversight": "Скривање корисника и измена",
"grant-patrol": "Патролирање измена",
"grant-privateinfo": "Приступи приватним информацијама",
"grant-protect": "Закључавање и откључавање страница",
"grant-basic": "Основна права",
"grant-viewdeleted": "Преглед обрисаних страница и датотека",
"grant-viewmywatchlist": "Преглед вашег списак надгледања",
+ "grant-viewrestrictedlogs": "Прегледање ограничених уноса у дневнику",
"newuserlogpage": "Дневник нових корисника",
"newuserlogpagetext": "Ово је дневник нових корисника.",
"rightslog": "Дневник корисничких права",
"action-writeapi": "писање АПИ-ја",
"action-delete": "брисање ове странице",
"action-deleterevision": "брисање измена",
+ "action-deletelogentry": "бирсање уноса у дневницима",
"action-deletedhistory": "прегледање обрисане историје странице",
+ "action-deletedtext": "преглед обрисаног текста измене",
"action-browsearchive": "претраживање обрисаних страница",
"action-undelete": "враћање страница",
"action-suppressrevision": "прегледање и враћање сакривених измена",
"recentchanges": "Скорашње измене",
"recentchanges-legend": "Опције скорашњих измена",
"recentchanges-summary": "Пратите скорашње измене на овој страници.",
- "recentchanges-noresult": "Нема промена у задатом времену за задате критеријуме.",
+ "recentchanges-noresult": "Нема измена у задатом периоду који одговарају овим критеријумима.",
+ "recentchanges-notargetpage": "Унесите назив странице како бисте видели сродне измене.",
"recentchanges-feed-description": "Пратите скорашње измене уз помоћ овог довода.",
"recentchanges-label-newpage": "Нова страница",
"recentchanges-label-minor": "Мања измена",
"rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|измена|измене}}, $2",
"rcfilters-date-popup-title": "Временски период",
"rcfilters-days-title": "Скорашњи дани",
- "rcfilters-hours-title": "СкоÑ\80аÑ\88Ñ\9aи сати",
+ "rcfilters-hours-title": "СкоÑ\80аÑ\88Ñ\9aе сати",
"rcfilters-days-show-days": "$1 {{PLURAL:$1|дан|дана}}",
"rcfilters-days-show-hours": "$1 {{PLURAL:$1|сат|сата}}",
"rcfilters-highlighted-filters-list": "Истакнуто: $1",
"rcfilters-watchlist-showupdated": "Измене на страницама које нисте посетили од када је измена извршена су <strong>подебљане</strong>, са испуњеним ознакама.",
"rcfilters-preference-label": "Сакриј побољшану верзију скорашњих измена",
"rcfilters-preference-help": "Поништава редизајн интерфејса из 2017. и све алатке додате тада и после.",
+ "rcfilters-filter-showlinkedfrom-label": "Прикажи измене на страницама са којих долазе везе",
+ "rcfilters-filter-showlinkedfrom-option-label": "<strong>Странице са којих долазе везе до</strong> изабране странице",
+ "rcfilters-filter-showlinkedto-label": "Прикажи измене на страницама ка којима воде везе",
+ "rcfilters-filter-showlinkedto-option-label": "<strong>Странице ка којима воде везе са</strong> одабране странице",
"rcnotefrom": "Испод {{PLURAL:$5|је измена|су измене}} од <strong>$3, $4</strong> (до <strong>$1</strong> приказано).",
"rclistfromreset": "Ресетуј одабир датума",
"rclistfrom": "Прикажи нове измене почев од $2, $3",
"boteditletter": "б",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|корисник надгледа|корисника надгледају|корисника надгледају}}]",
- "rc_categories": "Ограничи на категорије (раздвоји с усправном цртом):",
- "rc_categories_any": "Сви изабрани",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|бајт|бајта|бајтова}} после измене",
"newsectionsummary": "/* $1 */ нови одељак",
"uploaded-href-unsafe-target-svg": "Пронађен href са несигурним подацима: URI одредиште <code><$1 $2=\"$3\"></code> у постављеној SVG датотеци.",
"uploaded-animate-svg": "Пронађена „animate“ ознака која можда мења href користећи се „from“ атрибутом <code><$1 $2=\"$3\"></code> у постављеној SVG датотеци.",
"uploadscriptednamespace": "Ова SVG датотека садржи погрешан именски простор „<nowiki>$1</nowiki>“",
+ "uploadinvalidxml": "Није могуће рашчланити XML отпремљене датотеке.",
"uploadvirus": "Датотека садржи вирус!\nДетаљи: $1",
"uploadjava": "Датотека је формата ZIP који садржи јава .class елемент.\nСлање јава датотека није дозвољено јер оне могу изазвати заобилажење сигурносних ограничења.",
"upload-source": "Изворна датотека",
"upload-too-many-redirects": "Адреса садржи превише преусмерења",
"upload-http-error": "Дошло је до HTTP грешке: $1",
"upload-copy-upload-invalid-domain": "Примерци отпремања нису доступни на овом домену.",
- "upload-dialog-title": "Ð\9eÑ\82пÑ\80емаÑ\9aе даÑ\82оÑ\82ека",
+ "upload-dialog-title": "Ð\9eÑ\82пÑ\80еми даÑ\82оÑ\82екÑ\83",
"upload-dialog-button-cancel": "Откажи",
"upload-dialog-button-back": "Назад",
"upload-dialog-button-done": "Готово",
"upload-form-label-own-work": "Ово је моје сопствено дело",
"upload-form-label-infoform-categories": "Категорије",
"upload-form-label-infoform-date": "Датум",
+ "upload-form-label-not-own-work-local-generic-local": "Такође можете покушати [[Special:Upload|подразумевану страницу за отпремање]].",
"backend-fail-stream": "Не могу да емитујем датотеку $1.",
"backend-fail-backup": "Не могу да направим резерву датотеке $1.",
"backend-fail-notexists": "Датотека $1 не постоји.",
"uploadstash-badtoken": "Извршавање дате радње није успело, разлог томе може бити истек времена за уређивање. Покушајте поново.",
"uploadstash-errclear": "Чишћење датотека није успело.",
"uploadstash-refresh": "Освежи списак датотека",
+ "uploadstash-thumbnail": "погледај минијатуру",
"uploadstash-bad-path": "Путања не постоји.",
"uploadstash-bad-path-invalid": "Путања није исправна.",
"uploadstash-bad-path-unknown-type": "Непознат тип „$1“.",
+ "uploadstash-bad-path-unrecognized-thumb-name": "Непрепознато име минијатуре.",
+ "uploadstash-bad-path-bad-format": "Кључ „$1“ није у одговарајућем облику.",
+ "uploadstash-file-not-found-no-thumb": "Не могу добити минијатуру.",
+ "uploadstash-file-not-found-no-remote-thumb": "Добављање минијатуре није успело: $1\nАдреса = $2",
+ "uploadstash-file-not-found-missing-content-type": "Недостаје заглавље за врсту садржаја.",
+ "uploadstash-no-extension": "Нема траженог додатка.",
"invalid-chunk-offset": "Неисправна полазна тачка",
"img-auth-accessdenied": "Приступ је одбијен",
"img-auth-nopathinfo": "Недостаје PATH_INFO.\nВаш сервер није подешен да прослеђује овакве податке.\nМожда је заснован на CGI-ју који не подржава img_auth.\nПогледајте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization?uselang=sr-ec.",
"apisandbox-sending-request": "Слање API захтева...",
"apisandbox-loading-results": "Пријем API резултата...",
"apisandbox-results-error": "Дошло је до грешке приликом учитавања резултата API упита: $1.",
+ "apisandbox-request-selectformat-label": "Прикажи сахтеване податке као:",
"apisandbox-request-url-label": "Адреса захтева:",
"apisandbox-continue": "Настави",
"apisandbox-continue-clear": "Очисти",
"listgrouprights-namespaceprotection-namespace": "Именски простор",
"listgrouprights-namespaceprotection-restrictedto": "Права потребна за уређивање",
"listgrants": "Дозволе",
+ "listgrants-grant": "Дозвола",
"listgrants-rights": "Права",
"trackingcategories": "Медијавики категорије",
"trackingcategories-summary": "Ова посебна страница је списак категорија које су део Медијавикија, оне се аутоматски ажурирају и њихови називи се могу мењати уређивањем системских порука у именском простору {{ns:8}}.",
+ "trackingcategories-msg": "Праћење категорије",
"trackingcategories-name": "Име поруке",
"trackingcategories-desc": "Које странице се налазе у категорији",
+ "restricted-displaytitle-ignored": "Странице са занемареним насловима за приказ",
"noindex-category-desc": "Странице које у себи имају магичну реч <code><nowiki>__NOINDEX__</nowiki></code>.",
"index-category-desc": "Странице које у себи имају магичну реч <code><nowiki>__INDEX__</nowiki></code> и самим тим су индексиране од стране робота.",
"broken-file-category-desc": "Странице које имају везе до непостојећих датотека.",
"rollbacklinkcount": "врати $1 {{PLURAL:$1|измену|измене|измена}}",
"rollbacklinkcount-morethan": "врати више од $1 {{PLURAL:$1|измене|измене|измена}}",
"rollbackfailed": "Неуспешно враћање",
+ "rollback-missingrevision": "Не могу учитати податке о измени.",
"cantrollback": "Не могу да вратим измену.\nПоследњи аутор је уједно и једини.",
"alreadyrolled": "Враћање последње измене странице [[:$1]] од стране {{GENDER:$2|корисника|кориснице|корисника}} [[User:$2|$2]] ([[User talk:$2|разговор]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) није успело; неко други је у међувремену изменио или вратио страницу.\n\nПоследњу измену је {{GENDER:$3|направио|направила|направио}} [[User:$3|$3]] ([[User talk:$3|разговор]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
"editcomment": "Опис измене: <em>$1</em>.",
"revertpage": "Враћене измене [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]]) на последњу измену корисника [[User:$1|$1]]",
- "revertpage-nouser": "Ð\92Ñ\80аÑ\9bене Ñ\81Ñ\83 измене Ñ\81кÑ\80ивеног коÑ\80иÑ\81ника на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]",
- "rollback-success": "Ð\92Ñ\80аÑ\9bене Ñ\81Ñ\83 измене {{GENDER:$1|коÑ\80иÑ\81ника|коÑ\80иÑ\81ниÑ\86е}} {{GENDER:$3|$1}}\nна последњу измену {{GENDER:$2|корисника|кориснице}} {{GENDER:$4|$2}}.",
+ "revertpage-nouser": "Ð\98змене Ñ\81кÑ\80ивеног коÑ\80иÑ\81ника Ñ\81Ñ\83 вÑ\80аÑ\9bене на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]",
+ "rollback-success": "Ð\98змене {{GENDER:$1|коÑ\80иÑ\81ника|коÑ\80иÑ\81ниÑ\86е}} {{GENDER:$3|$1}} Ñ\81Ñ\83 вÑ\80аÑ\9bене на последњу измену {{GENDER:$2|корисника|кориснице}} {{GENDER:$4|$2}}.",
"sessionfailure-title": "Сесија је окончана",
"sessionfailure": "Изгледа да постоји проблем с вашом сесијом;\nова радња је отказана да би се избегла злоупотреба.\nВратите се на претходну страницу, поново је учитајте и покушајте поново.",
"changecontentmodel": "Промени модел садржаја странице",
"changecontentmodel-success-text": "Модел садржаја странице [[:$1]] је промењен.",
"changecontentmodel-cannot-convert": "Модел садржаја странице [[:$1]] се не може претворити у врсту $2.",
"changecontentmodel-nodirectediting": "Модел садржаја $1 не подржава изравно уређивање",
+ "changecontentmodel-emptymodels-title": "Нема доступних модела садржаја",
"log-name-contentmodel": "Дневник промене модела садржаја",
"log-description-contentmodel": "Ова страница приказује измене у моделима садржаја страница и странице које су направљене са моделом садржаја који се разликује од подразумеваног.",
"logentry-contentmodel-change": "$1 је {{GENDER:$2|променио|променила}} модел садржаја странице $3 из „$4“ у „$5“",
"block-log-flags-hiddenname": "корисничко име је сакривено",
"range_block_disabled": "Администраторска могућност за блокирање распона ИП адреса је онемогућена.",
"ipb_expiry_invalid": "Време истека је неисправно.",
+ "ipb_expiry_old": "Време истека је у прошлости.",
"ipb_expiry_temp": "Сакривене блокаде корисника морају бити трајне.",
"ipb_hide_invalid": "Не могу да потиснем овај налог; има више од {{PLURAL:$1|једне измене|$1 измена}}.",
"ipb_already_blocked": "„$1“ је већ блокиран.",
"ipb_blocked_as_range": "Грешка: IP адреса $1 није директно блокирана и не може да се деблокира.\nОна је блокирана као део блокаде $2, која може бити деблокирана.",
"ip_range_invalid": "Неисправан распон IP адреса.",
"ip_range_toolarge": "Опсежна блокирања већа од /$1 нису дозвољена.",
+ "ip_range_toolow": "IP-опсези нису дозвољени.",
"proxyblocker": "Блокер посредника",
"proxyblockreason": "Ваша ИП адреса је блокирана јер представља отворени посредник.\nОбратите се вашем добављачу интернет услуга или техничку подршку и обавестите их о овом озбиљном безбедносном проблему.",
"sorbs": "DNSBL",
"cant-move-user-page": "Немате дозволу за премештање основних корисничких страница (осим подстраница).",
"cant-move-to-user-page": "Немате дозволу за премештање странице на вашу корисничку страницу (осим на корисничку подстраницу).",
"cant-move-category-page": "Немате дозволу да премештате странице категорија.",
+ "cant-move-to-category-page": "Немате дозволу да преместите страницу на страницу категорије.",
+ "cant-move-subpages": "Немате дозволу да премештате подстранице.",
+ "namespace-nosubpages": "Имениски простор „$1“ не дозвољава подстранице.",
"newtitle": "Нови наслов:",
"move-watch": "Надгледај ову страницу",
"movepagebtn": "Премести страницу",
"export-download": "Сачувај као датотеку",
"export-templates": "Укључи шаблоне",
"export-pagelinks": "Укључи повезане странице до дубине од:",
+ "export-manual": "Ручно додај странице:",
"allmessages": "Системске поруке",
"allmessagesname": "Назив",
"allmessagesdefault": "Подразумевани текст",
"importuploaderrortemp": "Не могу да пошаљем датотеку за увоз.\nНедостаје привремена фасцикла.",
"import-parse-failure": "Погрешно рашчлањивање XML-а.",
"import-noarticle": "Нема странице за увоз!",
- "import-nonewrevisions": "Ð\98змене ниÑ\81Ñ\83 Ñ\83везене (Ñ\81ве Ñ\81Ñ\83 веÑ\9b биле или пÑ\80иÑ\81Ñ\83Ñ\82не или пÑ\80еÑ\81коÑ\87ене због гÑ\80еÑ\88ки).",
+ "import-nonewrevisions": "Ð\98змене ниÑ\81Ñ\83 Ñ\83везене (Ñ\81ве Ñ\81Ñ\83 веÑ\9b биле или пÑ\80иÑ\81Ñ\83Ñ\82не или пÑ\80еÑ\81коÑ\87ене због гÑ\80еÑ\88ака).",
"xml-error-string": "$1 у реду $2, колона $3 (бајт $4): $5",
"import-upload": "Отпремање XML података",
"import-token-mismatch": "Губитак података о сесији.\n\nМожда сте одјављени. '''Молимо Вас проверите да ли сте још увек пријављени и покушајте поново'''.\n\nАко и даље не ради, покушајте се [[Special:UserLogout|одјавити]] и поново пријавити и проверите да ли Ваш веб-пртраживач дозвољава колачиће са овог сајта.",
"tooltip-ca-move": "Премести ову страницу",
"tooltip-ca-watch": "Додај ову страницу на списак надгледања",
"tooltip-ca-unwatch": "Уклони ову страницу са списка надгледања",
- "tooltip-search": "Ð\9fÑ\80еÑ\82Ñ\80ага",
+ "tooltip-search": "Ð\9fÑ\80еÑ\82Ñ\80ажи",
"tooltip-search-go": "Идите на страницу с овим именом, ако постоји",
"tooltip-search-fulltext": "Претражите странице с овим текстом",
"tooltip-p-logo": "Посетите главну страну",
"feedback-termsofuse": "Прихватам да пошаљем повратне информације у складу са условима коришћења.",
"feedback-thanks": "Хвала! Ваша повратна информација је постављена на страницу „[$2 $1]“.",
"feedback-thanks-title": "Хвала вам!",
- "searchsuggest-search": "Ð\9fÑ\80еÑ\82Ñ\80ага",
+ "searchsuggest-search": "Ð\9fÑ\80еÑ\82Ñ\80ажи",
"searchsuggest-containing": "садржи...",
"api-error-badtoken": "Унутрашња грешка: неисправан жетон.",
"api-error-emptypage": "Стварање нових празних страница није дозвољено.",
"talk": "Razgovor",
"views": "Pregledi",
"toolbox": "Alatke",
- "tool-link-userrights": "Promeni {{GENDER:$1|korisničke}} grupe",
+ "tool-link-userrights": "Uredi {{GENDER:$1|korisničke}} grupe",
"tool-link-userrights-readonly": "Prikaži {{GENDER:$1|korisnik}} grupe",
"tool-link-emailuser": "Pošalji imejl",
"imagepage": "Pogledaj stranicu datoteke",
"recentchanges-legend": "Opcije skorašnjih izmena",
"recentchanges-summary": "Pratite skorašnje izmene na ovoj stranici.",
"recentchanges-noresult": "Nema promena u zadatom vremenu za zadate kriterijume.",
+ "recentchanges-notargetpage": "Unesite naziv stranice kako biste videli srodne izmene.",
"recentchanges-feed-description": "Pratite skorašnje izmene uz pomoć ovog dovoda.",
"recentchanges-label-newpage": "Ovom izmenom napravljena je nova izmena",
"recentchanges-label-minor": "Ovo je manja izmena",
"boteditletter": "b",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|korisnik nadgleda|korisnika nadgledaju|korisnika nadgledaju}}]",
- "rc_categories": "Ograniči na kategorije (razdvoji s uspravnom crtom):",
- "rc_categories_any": "Sve",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} posle izmene",
"newsectionsummary": "/* $1 */ novi odeljak",
"newpageletter": "Näi",
"boteditletter": "B",
"number_of_watching_users_pageview": "[$1 beooboachtjende {{PLURAL:$1|Benutser|Benutsere}}]",
- "rc_categories": "Bloot Sieden uut do Kategorien (tränd mäd „|“):",
- "rc_categories_any": "Aal",
"rc-change-size": "$1 {{PLURAL:$1|Byte|Bytes}}",
"newsectionsummary": "Näie Apsats /* $1 */",
"rc-enhanced-expand": "Details anwiese (bruukt JavaScript)",
"newpageletter": "A",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|ngawaskeun|ngawaskeun}}]",
- "rc_categories": "Watesan nepi ka kategori (dipisah ku \"|\"):",
- "rc_categories_any": "Unggal nu kapilih",
"rc-change-size-new": "$1 {{PLURAL:$1|bit|bit}} sanggeus robah",
"newsectionsummary": "/* $1 */ bagean anyar",
"rc-enhanced-expand": "Témbongkeun rincian",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 bevakande {{PLURAL:$1|användare|användare}}]",
- "rc_categories": "Begränsa till följande kategorier (separera med \"|\"):",
- "rc_categories_any": "Någon av de valda",
"rc-change-size-new": "$1 {{PLURAL:$1|byte}} efter ändring",
"newsectionsummary": "/* $1 */ nytt avsnitt",
"rc-enhanced-expand": "Visa detaljer",
"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ågot med din session som inloggad är på tok. Din begärda åtgärd har avbrutits, för att förhindra att någon kapar din session. Klicka på \"Tillbaka\" i din webbläsare och ladda om den sida du kom ifrån. Försök sedan igen.",
+ "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",
"changecontentmodel-legend": "Ändra innehållsmodell",
"changecontentmodel-title-label": "Sidtitel",
"watchlistedit-clear-titles": "Sidor:",
"watchlistedit-clear-submit": "Rensa bevakningslistan (Detta är permanent!)",
"watchlistedit-clear-done": "Din bevakningslista har rensats.",
+ "watchlistedit-clear-jobqueue": "Din bevakningslista skapas. Detta kan ta en stund!",
"watchlistedit-clear-removed": "{{PLURAL:$1|1 sida|$1 sidor}} togs bort:",
"watchlistedit-too-many": "Det finns för många sidor att visa här.",
"watchlisttools-clear": "Rensa bevakningslistan",
"newpageletter": "P",
"boteditletter": "r",
"number_of_watching_users_pageview": "[idadi ya {{PLURAL:$1|watumiaji}} wanaoufuatilia ni $1]",
- "rc_categories": "Chagua jamii zingine (uzitenge na kigawaji hiki \"|\")",
- "rc_categories_any": "Yoyote",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} baada ya mabadiliko",
"newsectionsummary": "/* $1 */ mjadala mpya",
"rc-enhanced-expand": "Onyesha maelezo",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|dowajůncy pozůr užytkowńik|dowajůncych pozůr užytkowńikůw}}]",
- "rc_categories": "Uůgrańič do katygorii (oddźelej za půmocům \"|\")",
- "rc_categories_any": "Wšyskie",
"rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajty|bajtůw}} po půmjyńyńu",
"newsectionsummary": "/* $1 */ nowo tajla",
"rc-enhanced-expand": "Pokoż szczygůły",
"newpageletter": "பு",
"boteditletter": "தா",
"number_of_watching_users_pageview": "[இப்பக்க்த்தை {{PLURAL:$1|ஒரு பயனர் பார்கிறார்|$1 பயனர்கள் பார்கிறார்கள்}}]",
- "rc_categories": "பகுப்புகளுக்கு மட்டுப்படுத்து (\"|\" குறியீட்டால் பிரிக்கப்பட்டுள்ளது)",
- "rc_categories_any": "தெரிவு செய்ததில் ஏதாவது",
"rc-change-size-new": "$1 {{PLURAL:$1|பைட்டு|பைட்டுகள்}} -மாற்றத்திற்குப் பிறகு",
"newsectionsummary": "/* $1 */ புதிய பகுதி",
"rc-enhanced-expand": "விவரத்தை காட்டு",
"minoreditletter": "cipuq",
"newpageletter": "Giqas",
"boteditletter": "squliq na kikay",
- "rc_categories_any": "Ana nanu’ binzyagan na",
"rc-change-size-new": "sin-nbah$1 {{PLURAL:bzyaqan kkayal na llpgan}}",
"rc-old-title": "pins’ruxsa minqsu’ na lalu’ ga \"$1\"",
"recentchangeslinked": "M’ubuy quw zyuwaw na sinbahan",
"minoreditletter": "ಕಿ",
"newpageletter": "ಪೊ",
"boteditletter": "ಬಾ",
- "rc_categories_any": "ಒವ್ವೇ",
"rc-change-size-new": "$1 {{PLURAL:$1|ಬೈಟ್|ಬೈಟ್ಲು}}ಬದಲಾವಣೆಡ್ದ್ ಬುಕ್ಕೊ",
"newsectionsummary": "\n/* $1 */ಪೊಸ ವಿಭಾಗ",
"rc-enhanced-expand": "ವಿವರೊಲೆನ್ ತೊಜಾವ್",
"newpageletter": "కొ",
"boteditletter": "బా",
"number_of_watching_users_pageview": "[వీక్షిస్తున్న సభ్యులు: {{PLURAL:$1|ఒక్కరు|$1}}]",
- "rc_categories": "ఈ వర్గాలకు పరిమితం చెయ్యి (\"|\" తో వేరు చెయ్యండి):",
- "rc_categories_any": "ఎంచుకున్నది ఏదయినా",
"rc-change-size-new": "మార్పు తర్వాత $1 {{PLURAL:$1|బైటు|బైట్లు}}",
"newsectionsummary": "/* $1 */ కొత్త విభాగం",
"rc-enhanced-expand": "వివరాలను చూపించు",
"newpageletter": "Нав",
"boteditletter": "б",
"number_of_watching_users_pageview": "[$1 пайгирикунанда {{PLURAL:$1|корбар|корбарон}}]",
- "rc_categories": "Маҳдудият ба гурӯҳҳо (бо аломати \"|\" ҷудо кунед)",
- "rc_categories_any": "Ҳар кадом",
"rc-change-size-new": "$1 {{PLURAL:$1|байт}} пас аз тағйир",
"newsectionsummary": "/* $1 */ бахши ҷадид",
"rc-enhanced-expand": "Намоиши ҷузъиёт",
"newpageletter": "Nav",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 pajgirikunanda {{PLURAL:$1|korbar|korbaron}}]",
- "rc_categories": "Mahdudijat ba gurūhho (bo alomati \"|\" çudo kuned)",
- "rc_categories_any": "Har kadom",
"newsectionsummary": "/* $1 */ baxşi çadid",
"rc-enhanced-expand": "Namoişi çuz'ijot (nijozmand ba Çava Skript)",
"rc-enhanced-hide": "Pinhoni çuz'ijot",
"boteditletter": "บ",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 ผู้ใช้เฝ้าดู]",
- "rc_categories": "จำกัดเฉพาะหมวดหมู่ (แยกด้วย \"|\"):",
- "rc_categories_any": "อะไรก็ได้ที่เลือก",
"rc-change-size-new": "$1 ไบต์หลังเปลี่ยนแปลง",
"newsectionsummary": "/* $1 */ ส่วนใหม่",
"rc-enhanced-expand": "แสดงรายละเอียด",
"newpageletter": "T",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|ulanyjy|ulanyjy}} gözegçilik edýär]",
- "rc_categories": "Kategoriýalar bilen çäklendir (\"|\" bilen aýyr)",
- "rc_categories_any": "Islendik",
"newsectionsummary": "/* $1 */ täze bölüm",
"rc-enhanced-expand": "Jikme-jikligi görkez",
"rc-enhanced-hide": "Jikme-jiklikleri gizle",
"boteditletter": "b",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 binabantayang {{PLURAL:$1|tagagamit|mga tagagamit}}]",
- "rc_categories": "Itakda lang sa mga kaurian (ihiwalay sa pamamagitan ng \"|\")",
- "rc_categories_any": "Kahit ano",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|byte}} pagkaraan ng pagbabago",
"newsectionsummary": "/* $1 */ bagong seksyon",
"minoreditletter": "г",
"newpageletter": "Т",
"boteditletter": "б",
- "rc_categories_any": "Һар гылә",
"newsectionsummary": "/* $1 */ нујә мывзу",
"rc-enhanced-expand": "Тәфсилотон нишо дој (JavaScript истифодә бедә)",
"rc-enhanced-hide": "Тәфсилотон нијо кардеј",
"minoreditletter": "s",
"newpageletter": "F",
"boteditletter": "m",
- "rc_categories": "Fakangatangata ki he faʻahinga (vaheʻi he \"|\")",
- "rc_categories_any": "Faʻahinga noa pē",
"rc-enhanced-expand": "ʻAsi ngaahi ʻeu (fiemaʻu ʻa e ''Javascript'')",
"rc-enhanced-hide": "Toi ngaahi ʻeu",
"recentchangeslinked": "Ngaahi liliu fekauʻaki",
"minoreditletter": "m",
"newpageletter": "N",
"boteditletter": "b",
- "rc_categories": "Soim ol senis insait long ol dispela grup tasol (raitim wantaim \"|\" namel long wanwan)",
- "rc_categories_any": "Olgeta",
"recentchangeslinked": "Ol senis klostu",
"recentchangeslinked-feed": "Ol senis klostu",
"recentchangeslinked-toolbox": "Ol senis klostu",
"newpageletter": "Y",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 izlenilen {{PLURAL:$1|kullanıcı|kullanıcı}}]",
- "rc_categories": "Kategorileri sınırla (\"|\" ile ayır)",
- "rc_categories_any": "Seçilen herhangi bir",
"rc-change-size-new": "Değişiklikten sonraki boyut: $1 {{PLURAL:$1|bayt|bayt}}",
"newsectionsummary": "/* $1 */ yeni başlık",
"rc-enhanced-expand": "Ayrıntıları göster",
"newpageletter": "Я",
"boteditletter": "б",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|күзәтүче кулланучы}}]",
- "rc_categories": "Төркемнәрдән генә («|» бүлүче):",
- "rc_categories_any": "Сайланганның һәрберсе",
"rc-change-size-new": "Кертелгән үзгәрешләр белән бергә зурлык: $1 {{PLURAL:$1|байт}}",
"newsectionsummary": "/* $1 */ яңа бүлек",
"rc-enhanced-expand": "Ваклыкларны күрсәтү",
"newpageletter": "Y",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|küzätep tora qullanuçı}}]",
- "rc_categories": "Törkemnärdä genä tora («|» bülüçe)",
- "rc_categories_any": "Härber",
"rc-change-size-new": "üzgäreştän soñ $1 {{PLURAL:$1|bayt}}",
"newsectionsummary": "/* $1 */ yaña bülek",
"rc-enhanced-expand": "Waqlıqlarnı kürsätü (JavaScript kiräk)",
"newpageletter": "ⵏ",
"boteditletter": "ⴱ",
"unpatrolledletter": "!",
- "rc_categories_any": "ⵎⴰⵏ",
"recentchangeslinked-toolbox": "ⵉⴱⴷⴷⴻⵍⵏ ⵖⵓⵔ ⵜⴰⵣⴷⴰⵢⵜ",
"recentchangeslinked-page": "ⴰⵙⵙⴰⵖ ⵏ ⵜⴰⵙⵏⴰ:",
"upload": "ⵣⴷⴻⵎ ⴰⵙⴷⴰⵡ",
"boteditletter": "ماشىنا ئادەم",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|ئىشلەتكۈچى|ئىشلەتكۈچى}}كۆزىتىۋاتىدۇ]",
- "rc_categories": "تۈر چېگرىسى (\"|\" بىلەن ئايرىلىدۇ )",
- "rc_categories_any": "خالىغانچە تاللاش",
"rc-change-size": "$1",
"rc-change-size-new": "ئۆزگەرتكەندىن كېيىن $1 {{PLURAL:$1|بايت}}",
"newsectionsummary": "* $1 * يېڭى ئابزاس",
"boteditletter": "б",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|користувач спостерігає|користувачі спостерігають|користувачів спостерігають}}]",
- "rc_categories": "Тільки з категорій (розділювач «|»):",
- "rc_categories_any": "Будь-яка з обраних",
"rc-change-size": "$1",
"rc-change-size-new": "Розмір після зміни: $1 {{PLURAL:$1|байт|байти|байтів}}",
"newsectionsummary": "/* $1 */ нова тема",
"newpageletter": "نیا ..",
"boteditletter": " خودکار",
"number_of_watching_users_pageview": "[$1 مشاہد {{PLURAL:$1|صارف|صارفین}}]",
- "rc_categories": "ان زمروں تک محدود رکھیں («|» سے علاحدہ کریں):",
- "rc_categories_any": "کوئی بھی منتخب",
"rc-change-size-new": "تبدیلی کے بعد $1 {{PLURAL:$1|بائٹ}}",
"newsectionsummary": "/* $1 */ نیا قطعہ",
"rc-enhanced-expand": "تفصیلات دکھائیں",
"logentry-move-move": "$1 نے صفحہ $3 کو $4 کی جانب منتقل کیا",
"logentry-move-move-noredirect": "$1 نے صفحہ $3 کو $4 کی جانب بدون رجوع مکرر {{GENDER:$2|منتقل کیا}}",
"logentry-move-move_redir": "$1 نے رجوع مکرر ہٹا کر صفحہ $3 کو $4 کی جانب {{GENDER:$2|منتقل کیا}}",
- "logentry-move-move_redir-noredirect": "$1 نے صفحہ $3 کو رجوع مکرر چھوڑے بغیر $4 کی جانب جو رجوع مکر تھا {{GENDER:$2|منتقل کیا}}",
+ "logentry-move-move_redir-noredirect": "$1 نے صفحہ $3 کو رجوع مکرر چھوڑے بغیر $4 کی جانب جو رجوع مکرر تھا {{GENDER:$2|منتقل کیا}}",
"logentry-patrol-patrol": "$1 نے صفحہ $3 کے نسخہ $4 کو مراجعت شدہ {{GENDER:$2|نشان زد کیا}}",
"logentry-patrol-patrol-auto": "$1 نے صفحہ $3 کے نسخہ $4 کو خودکار طور پر مراجعت شدہ {{GENDER:$2|نشان زد کیا}}",
"logentry-newusers-newusers": "صارف کھاتہ $1 {{GENDER:$2|تخلیق ہو چکا ہے}}",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[osservà da {{PLURAL:$1|un utente|$1 utenti}}]",
- "rc_categories": "Limita a le categorie (separà da \"|\")",
- "rc_categories_any": "Qualsiasi",
"rc-change-size-new": "$1 {{PLURAL:$1|byte}} dopo ła modifega",
"newsectionsummary": "/* $1 */ sezion nova",
"rc-enhanced-expand": "Mostra detaji",
"newpageletter": "U",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|kaclii kävutai|kaclijad kävutajad}}]",
- "rc_categories": "Vaiše kategorijoišpäi (erigoitkat znamaižel \"|\")",
- "rc_categories_any": "Eraz",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|bait|baitad}} jäl'ges toižetamišt",
"newsectionsummary": "/* $1 */ uz' jaguz",
"newpageletter": "M",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 người đang xem]",
- "rc_categories": "Hạn chế theo thể loại (phân cách bằng “|”):",
- "rc_categories_any": "Bất kỳ được chọn",
"rc-change-size-new": "$1 byte sau thay đổi",
"newsectionsummary": "Đề mục mới: /* $1 */",
"rc-enhanced-expand": "Xem chi tiết",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[{{PLURAL:$1|geban|gebans}} galädöl $1]",
- "rc_categories": "Te klads fovik (ditolös me el \"|\")",
- "rc_categories_any": "Alseimik",
"rc-change-size-new": "{{PLURAL:$1|jölät|jöläts}} $1 po votükam",
"newsectionsummary": "/* $1 */ diläd nulik",
"rc-enhanced-expand": "Jonön patis",
"newpageletter": "V",
"boteditletter": "rb",
"number_of_watching_users_pageview": "[{{PLURAL:$1|$1 perräkaejat|üts perräkaeja}}]",
- "rc_categories": "Õnnõ katõgoorijist (eräldedäs märgiga \"|\")",
- "rc_categories_any": "Miä taht",
"rc-change-size-new": "$1 {{PLURAL:$1|bait|baiti}} peräst muutmist",
"rc-enhanced-expand": "Näütäq ütsikasjo",
"rc-enhanced-hide": "Käkiq ütsikas'aq ärq",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[shuvou pa $1 {{PLURAL:$1|uzeu|uzeus}}]",
- "rc_categories": "Limiter åzès categoreyes (separer avou des «|»)",
- "rc_categories_any": "Totes",
"rc-change-size-new": "$1 {{PLURAL:$1|octet|octets}} après l' candjmint",
"newsectionsummary": "/* $1 */ novele seccion",
"rc-enhanced-expand": "Mostrer les detays",
"newpageletter": "B",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 nagbabatay hin {{PLURAL:$1|gumaramit|mga gumaramit}}]",
- "rc_categories_any": "Bisan ano nga pinili",
"rc-change-size-new": "$1 {{PLURAL:$1|nga byte|nga mga byte}} kahuman han pagbag-o",
"newsectionsummary": "/* $1 */ bag-o nga bahin",
"rc-enhanced-expand": "Igpakita an detalye",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[{{PLURAL:$1|jëfandikukat moo koy topp|$1 jëfandikukat ñoo koy topp}}]",
- "rc_categories": "Digalub wàll yi (xaajale leen ak « \"|\" »)",
- "rc_categories_any": "Yépp",
"rc-change-size": "$1",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ginnaaw coppite gi",
"newsectionsummary": "/* $1 */ xaaj bu bees",
"newpageletter": "ახ.",
"boteditletter": "ბ",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|მომხმარებლის|მომხმარებლის}} კონტროლი]",
- "rc_categories": "ხვალო კატეგორიეფშე (გეგშართით \"|\"-იშ მეჯინათ)",
- "rc_categories_any": "არძონერი",
"rc-change-size-new": "ზჷმა თირუაშ უკული რე: {{PLURAL:$1|ბაიტი|ბაიტი}}",
"newsectionsummary": "/* $1 */ ახალი სექცია",
"rc-enhanced-expand": "დეტალების ჩვენება",
"newpageletter": "נ",
"boteditletter": "ב",
"number_of_watching_users_pageview": "[{{PLURAL:$1|איין באַניצער פאַסט|$1 באַניצערס פאַסן}} אויף]",
- "rc_categories": "גרענעץ פֿאַר קאַטעגאריעס (אָפשיידן מיט \"|\")",
- "rc_categories_any": "איינער פון די געקליבענע",
"rc-change-size-new": "$1 {{PLURAL:$1|בייט|בייטן}} נאך דער ענדערונג",
"newsectionsummary": "/* $1 */ נייע אפטיילונג",
"rc-enhanced-expand": "צייגן דעטאלן",
"newpageletter": "T",
"boteditletter": "b",
"number_of_watching_users_pageview": "[{{PLURAL:$1|Oníṣe $1|Àwọn oníṣe $1}} ún ṣe ìmójútó]",
- "rc_categories": "Òpin sí àwọn ẹ̀ka (pínsọ́tọ̀ pẹ̀lú \"|\")",
- "rc_categories_any": "Èyíkéyìí",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} lẹ́yìn àtúnṣe",
"newsectionsummary": "/* $1 */ abala tuntun",
"rc-enhanced-expand": "Ìfihàn ẹ̀kúnrẹ́rẹ́",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1位用戶監視]",
- "rc_categories": "限定到分類(以\"|\"作分隔):",
- "rc_categories_any": "任何揀咗嘅",
"rc-change-size-new": "改完後係$1位元組",
"newsectionsummary": "/* $1 */ 新小節",
"rc-enhanced-expand": "顯示細節",
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|keêr|keêr}} op een volglieste]",
- "rc_categories": "Beperk'n tot categorieën (scheien mie een \"|\")",
- "rc_categories_any": "Elk'n",
"newsectionsummary": "/* $1 */ nieuwe subkop",
"rc-enhanced-expand": "Details weerheven (JavaScript vereist)",
"rc-enhanced-hide": "Verbarg details",
"newpageletter": "新",
"boteditletter": "机",
"number_of_watching_users_pageview": "[$1个关注用户]",
- "rc_categories": "分类限制(用“|”分隔):",
- "rc_categories_any": "任何选择的",
"rc-change-size-new": "更改后有$1字节",
"newsectionsummary": "/* $1 */ 新章节",
"rc-enhanced-expand": "显示细节",
"nosuchaction": "無此動作",
"nosuchactiontext": "URL 所指定的動作無效。\n您的 URL 可能輸入錯誤,或點選了錯誤的連結。\n這也可能是 {{SITENAME}} 使用的系統出現問題。",
"nosuchspecialpage": "無此特殊頁面",
- "nospecialpagetext": "<strong>您請求的特殊頁面無效。</strong>\n\n欲取得有效的特殊頁面清單可至 [[Special:SpecialPages|{{int:specialpages}}]]。",
+ "nospecialpagetext": "<strong>您請求的特定頁面無效。</strong>\n\n欲取得有效的特定頁面清單可至 [[Special:SpecialPages|{{int:specialpages}}]]。",
"error": "錯誤",
"databaseerror": "資料庫錯誤",
"databaseerror-text": "出現資料庫查詢錯誤。\n這可能表示系統有問題存在。",
"newpageletter": "新",
"boteditletter": "機",
"number_of_watching_users_pageview": "[$1 位正在監視的使用者]",
- "rc_categories": "分類限制 (以 \"|\" 分隔):",
- "rc_categories_any": "任何選擇的",
"rc-change-size-new": "變更後為 $1 位元組",
"newsectionsummary": "/* $1 */ 新章節",
"rc-enhanced-expand": "顯示詳細資料",
"creditspage": "頁面製作群",
"nocredits": "此頁面沒有製作群資訊。",
"spamprotectiontitle": "垃圾訊息過濾程式",
- "spamprotectiontext": "您輸入文字內容已被垃圾訊息過濾程式禁止儲存,\n可能因您的內容包含了已封鎖的外部連結。",
+ "spamprotectiontext": "您輸入文字內容已被垃圾訊息過濾程式禁止儲存,可能因您的內容包含了已封鎖的外部連結。",
"spamprotectionmatch": "以下文字內容觸發垃圾訊息過濾程式:$1",
"spambot_username": "MediaWiki 垃圾訊息清理",
"spam_reverting": "還原至未包含 $1 連結的最新修訂",
"colon-separator": ":",
"word-separator": "",
"ellipsis": "…",
- "parentheses": " ($1)",
+ "parentheses": "($1)",
"quotation-marks": "\"$1\"",
"imgmultipageprev": "← 上一頁",
"imgmultipagenext": "下一頁 →",
"logentry-protect-protect-cascade": "$1 {{GENDER:$2|已保護}} $3 $4 [連鎖]",
"logentry-protect-modify": "$1 {{GENDER:$2|已更改}} $3 的保護層級 $4",
"logentry-protect-modify-cascade": "$1 {{GENDER:$2|已更改}} $3 的保護層級 $4 [連鎖]",
- "logentry-rights-rights": "$1 {{GENDER:$2|已更改}} {{GENDER:$6|$3}} 的群組成員資格由 $4 成為 $5",
+ "logentry-rights-rights": "$1已將{{GENDER:$6|$3}}的使用者群組從$4{{GENDER:$2|更改}}至$5",
"logentry-rights-rights-legacy": "$1 {{GENDER:$2|已更改}} $3 的群組成員資格",
"logentry-rights-autopromote": "$1 已自動{{GENDER:$2|提升}}從 $4 成為 $5",
"logentry-upload-upload": "$1 {{GENDER:$2|已上傳}} $3",
"logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|已移除}}{{PLURAL:$9|標籤|標籤}} $8 自日誌項目 $3 的修訂 $5。",
"logentry-tag-update-revision": "$1 {{GENDER:$2|已更新}}標籤於頁面 $3 的修訂 $4 ({{PLURAL:$7|加入}} $6; {{PLURAL:$9|移除}} $8)。",
"logentry-tag-update-logentry": "$1 {{GENDER:$2|已更新}}標籤於頁面 $3 的日誌項目 $5 ({{PLURAL:$7|加入}} $6; {{PLURAL:$9|移除}} $8)。",
- "rightsnone": "(無)",
+ "rightsnone": "(無)",
"rightslogentry-temporary-group": "$1 (臨時,直到 $2)",
"feedback-adding": "正在新增意見回饋至頁面...",
"feedback-back": "返回",
"http://en.wikipedia.org. This is sometimes necessary because " .
"server name detection may fail in command line scripts.", false, true );
$this->addOption( 'profiler', 'Profiler output format (usually "text")', false, true );
+ // This is named --mwdebug, because --debug would conflict in the phpunit.php CLI script.
+ $this->addOption( 'mwdebug', 'Enable built-in MediaWiki development settings', false, true );
# Save generic options to display them separately in help
$this->mGenericParameters = $this->mParams;
MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->destroy();
}
+ # Apply debug settings
+ if ( $this->hasOption( 'mwdebug' ) ) {
+ require __DIR__ . '/../includes/DevelopmentSettings.php';
+ }
+
// Per-script profiling; useful for debugging
$this->activateProfiler();
}
}
+ if ( this.isSticky() ) {
+ // If this group is sticky, then change the default according to the
+ // current selection.
+ this.defaultParams = this.getParamRepresentation( this.getSelectedState() );
+ }
+
if (
changed ||
this.active !== active ||
this.currSelected !== item
) {
- if ( this.isSticky() ) {
- // If this group is sticky, then change the default according to the
- // current selection.
- this.defaultParams = this.getParamRepresentation( this.getSelectedState() );
- }
-
this.active = active;
this.currSelected = item;
* @return {string}
*/
ForeignStructuredUpload.prototype.getDescriptions = function () {
+ var upload = this;
return this.descriptions.map( function ( desc ) {
- return this.config.format.description
+ return upload.config.format.description
.replace( '$LANGUAGE', desc.language )
.replace( '$TEXT', desc.text );
} ).join( '\n' );
$cache = \MediaWiki\MediaWikiServices::getInstance()->getMainWANObjectCache();
$jobq = JobQueueGroup::singleton();
- // Delete EditPage jobs that might have been left behind by other tests
+ // Delete jobs that might have been left behind by other tests
$jobq->get( 'htmlCacheUpdate' )->delete();
$jobq->get( 'recentChangesUpdate' )->delete();
+ $jobq->get( 'userGroupExpiry' )->delete();
$cache->delete( $cache->makeKey( 'SiteStats', 'jobscount' ) );
$jobq->push( new NullJob( Title::newMainPage(), [] ) );
use Wikimedia\Rdbms\ResultWrapper;
class DatabaseSqliteMock extends DatabaseSqlite {
- private $lastQuery;
-
public static function newInstance( array $p = [] ) {
$p['dbFilePath'] = ':memory:';
$p['schema'] = false;
}
function query( $sql, $fname = '', $tempIgnore = false ) {
- $this->lastQuery = $sql;
-
return true;
}
public function tableExists( $table, $fname = __METHOD__ ) {
$tableRaw = $this->tableName( $table, 'raw' );
- if ( isset( $this->mSessionTempTables[$tableRaw] ) ) {
+ if ( isset( $this->sessionTempTables[$tableRaw] ) ) {
return true; // already known to exist
}
try {
throw new BadTitleError();
} catch ( BadTitleError $e ) {
+ ob_start();
$e->report();
- $this->assertTrue( true );
+ $text = ob_get_clean();
+ $this->assertContains( $e->getText(), $text );
}
}
try {
throw new ThrottledError();
} catch ( ThrottledError $e ) {
+ ob_start();
$e->report();
- $this->assertTrue( true );
+ $text = ob_get_clean();
+ $this->assertContains( $e->getText(), $text );
}
}
* @dataProvider provideComparePositions
* @covers Wikimedia\Rdbms\MySQLMasterPos
*/
- public function testHasReached( MySQLMasterPos $lowerPos, MySQLMasterPos $higherPos, $match ) {
+ public function testHasReached(
+ MySQLMasterPos $lowerPos, MySQLMasterPos $higherPos, $match, $hetero
+ ) {
if ( $match ) {
$this->assertTrue( $lowerPos->channelsMatch( $higherPos ) );
- $this->assertTrue( $higherPos->hasReached( $lowerPos ) );
- $this->assertTrue( $higherPos->hasReached( $higherPos ) );
+ if ( $hetero ) {
+ // Each position is has one channel higher than the other
+ $this->assertFalse( $higherPos->hasReached( $lowerPos ) );
+ } else {
+ $this->assertTrue( $higherPos->hasReached( $lowerPos ) );
+ }
$this->assertTrue( $lowerPos->hasReached( $lowerPos ) );
+ $this->assertTrue( $higherPos->hasReached( $higherPos ) );
$this->assertFalse( $lowerPos->hasReached( $higherPos ) );
} else { // channels don't match
$this->assertFalse( $lowerPos->channelsMatch( $higherPos ) );
[
new MySQLMasterPos( 'db1034-bin.000976/843431247', $now ),
new MySQLMasterPos( 'db1034-bin.000976/843431248', $now ),
- true
+ true,
+ false
],
[
new MySQLMasterPos( 'db1034-bin.000976/999', $now ),
new MySQLMasterPos( 'db1034-bin.000976/1000', $now ),
- true
+ true,
+ false
],
[
new MySQLMasterPos( 'db1034-bin.000976/999', $now ),
new MySQLMasterPos( 'db1035-bin.000976/1000', $now ),
+ false,
false
],
// MySQL GTID style
[
new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:23', $now ),
new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:24', $now ),
- true
+ true,
+ false
],
[
new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:99', $now ),
new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:100', $now ),
- true
+ true,
+ false
],
[
new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:99', $now ),
new MySQLMasterPos( '1E11FA47-71CA-11E1-9E33-C80AA9429562:100', $now ),
+ false,
false
],
// MariaDB GTID style
[
new MySQLMasterPos( '255-11-23', $now ),
new MySQLMasterPos( '255-11-24', $now ),
- true
+ true,
+ false
],
[
new MySQLMasterPos( '255-11-99', $now ),
new MySQLMasterPos( '255-11-100', $now ),
- true
+ true,
+ false
],
[
new MySQLMasterPos( '255-11-999', $now ),
new MySQLMasterPos( '254-11-1000', $now ),
+ false,
+ false
+ ],
+ [
+ new MySQLMasterPos( '255-11-23,256-12-50', $now ),
+ new MySQLMasterPos( '255-11-24', $now ),
+ true,
+ false
+ ],
+ [
+ new MySQLMasterPos( '255-11-99,256-12-50,257-12-50', $now ),
+ new MySQLMasterPos( '255-11-1000', $now ),
+ true,
+ false
+ ],
+ [
+ new MySQLMasterPos( '255-11-23,256-12-50', $now ),
+ new MySQLMasterPos( '255-11-24,155-52-63', $now ),
+ true,
+ false
+ ],
+ [
+ new MySQLMasterPos( '255-11-99,256-12-50,257-12-50', $now ),
+ new MySQLMasterPos( '255-11-1000,256-12-51', $now ),
+ true,
+ false
+ ],
+ [
+ new MySQLMasterPos( '255-11-99,256-12-50', $now ),
+ new MySQLMasterPos( '255-13-1000,256-14-49', $now ),
+ true,
+ true
+ ],
+ [
+ new MySQLMasterPos( '253-11-999,255-11-999', $now ),
+ new MySQLMasterPos( '254-11-1000', $now ),
+ false,
false
],
];
$this->assertFalse( (bool)$db->trxLevel(), "Transaction cleared." );
}
+ /**
+ * @covers Wikimedia\Rdbms\Database::getScopedLockAndFlush
+ * @covers Wikimedia\Rdbms\Database::lock
+ * @covers Wikimedia\Rdbms\Database::unlock
+ * @covers Wikimedia\Rdbms\Database::lockIsFree
+ */
public function testGetScopedLock() {
$db = $this->getMockDB( [ 'isOpen' ] );
$db->method( 'isOpen' )->willReturn( true );
+ $this->assertEquals( 0, $db->trxLevel() );
+ $this->assertEquals( true, $db->lockIsFree( 'x', __METHOD__ ) );
+ $this->assertEquals( true, $db->lock( 'x', __METHOD__ ) );
+ $this->assertEquals( false, $db->lockIsFree( 'x', __METHOD__ ) );
+ $this->assertEquals( true, $db->unlock( 'x', __METHOD__ ) );
+ $this->assertEquals( true, $db->lockIsFree( 'x', __METHOD__ ) );
+ $this->assertEquals( 0, $db->trxLevel() );
+
+ $db->setFlag( DBO_TRX );
+ $this->assertEquals( true, $db->lockIsFree( 'x', __METHOD__ ) );
+ $this->assertEquals( true, $db->lock( 'x', __METHOD__ ) );
+ $this->assertEquals( false, $db->lockIsFree( 'x', __METHOD__ ) );
+ $this->assertEquals( true, $db->unlock( 'x', __METHOD__ ) );
+ $this->assertEquals( true, $db->lockIsFree( 'x', __METHOD__ ) );
+ $db->clearFlag( DBO_TRX );
+
+ $this->assertEquals( 0, $db->trxLevel() );
+
$db->setFlag( DBO_TRX );
try {
$this->badLockingMethodImplicit( $db );
'use-bagostuff' => false,
'use-jobqueue' => false,
'use-normal-tables' => false,
+ 'mwdebug' => false,
'reuse-db' => false,
'wiki' => false,
'profiler' => false,
private static $testGlobals = [
[
'MiserMode' => false,
- 'AllowCategorizedRecentChanges' => false,
],
[
'MiserMode' => true,
- 'AllowCategorizedRecentChanges' => true,
],
];