$wgRCFeeds configuration array. $wgRCFeeds makes both the format and
destination of recent change notifications customizable, and allows for
multiple destinations to be specified.
+* (bug 53862) portal-url, currentevents-url and helppage have been removed from the
+ default Sidebar.
=== New features in 1.22 ===
* (bug 44525) mediawiki.jqueryMsg can now parse (whitelisted) HTML elements and attributes.
* Add deferrable update support for callback/closure
* Add TitleMove hook before page renames
* Revision deletion backend code is moved out of SpecialRevisiondelete
+* Add a variable (wgRedactedFunctionArguments) to redact the values sent as certain function
+ parameters from exception stack traces.
+* Added {{REVISIONSIZE}} variable to get the current size of a revision.
=== Bug fixes in 1.22 ===
* Disable Special:PasswordReset when $wgEnableEmail is false. Previously one
* mw.util.tooltipAccessKeyRegexp: The regex now matches "option-" as well.
Support for Mac "option" was added in 1.16, but the regex was never updated.
* (bug 46768) Usernames of blocking users now display correctly, even if numeric.
-* (bug 39590) {{PAGESIZE}} for the current page and self-transclusions now
- show the most up to date result always instead of being a revision behind.
+* (bug 39590) Self-transclusions now show the most up to date result always
+ after save instead of being a revision behind.
* A bias in wfRandomString() toward digits 1-7 has been corrected. Generated
strings will now start with digits 0 and 8-f as often as they should.
* (bug 45371) Removed Parser_LinkHooks and CoreLinkFunctions classes.
*/
$wgShowExceptionDetails = false;
+/**
+ * Array of functions which need parameters redacted from stack traces shown to
+ * clients and logged. Keys are in the format '[class::]function', and the
+ * values should be either an integer or an array of integers. These are the
+ * indexes of the parameters which need to be kept secret.
+ * @since 1.22
+ */
+$wgRedactedFunctionArguments = array(
+ 'AuthPlugin::setPassword' => 1,
+ 'AuthPlugin::authenticate' => 1,
+ 'AuthPlugin::addUser' => 1,
+
+ 'DatabaseBase::__construct' => 2,
+ 'DatabaseBase::open' => 2,
+
+ 'SpecialChangeEmail::attemptChange' => 1,
+ 'SpecialChangePassword::attemptReset' => 0,
+
+ 'User::setPassword' => 0,
+ 'User::setInternalPassword' => 0,
+ 'User::checkPassword' => 0,
+ 'User::setNewpassword' => 0,
+ 'User::comparePasswords' => array( 0, 1 ),
+ 'User::checkTemporaryPassword' => 0,
+ 'User::setToken' => 0,
+ 'User::crypt' => 0,
+ 'User::oldCrypt' => 0,
+ 'User::getPasswordValidity' => 0,
+ 'User::isValidPassword' => 0,
+);
+
/**
* If true, show a backtrace for database errors
*/
if ( $wgShowExceptionDetails ) {
return '<p>' . nl2br( htmlspecialchars( $this->getMessage() ) ) .
- '</p><p>Backtrace:</p><p>' . nl2br( htmlspecialchars( $this->getTraceAsString() ) ) .
+ '</p><p>Backtrace:</p><p>' . nl2br( htmlspecialchars( MWExceptionHandler::formatRedactedTrace( $this ) ) ) .
"</p>\n";
} else {
return "<div class=\"errorbox\">" .
if ( $wgShowExceptionDetails ) {
return $this->getMessage() .
- "\nBacktrace:\n" . $this->getTraceAsString() . "\n";
+ "\nBacktrace:\n" . MWExceptionHandler::formatRedactedTrace( $this ) . "\n";
} else {
return "Set \$wgShowExceptionDetails = true; " .
"in LocalSettings.php to show detailed debugging information.\n";
$log = $this->getLogMessage();
if ( $log ) {
if ( $wgLogExceptionBacktrace ) {
- wfDebugLog( 'exception', $log . "\n" . $this->getTraceAsString() . "\n" );
+ wfDebugLog( 'exception', $log . "\n" . MWExceptionHandler::formatRedactedTrace( $this ) . "\n" );
} else {
wfDebugLog( 'exception', $log );
}
$message = "MediaWiki internal error.\n\n";
if ( $wgShowExceptionDetails ) {
- $message .= 'Original exception: ' . $e->__toString() . "\n\n" .
+ $message .= 'Original exception: ' . self::formatRedactedTrace( $e ) . "\n\n" .
'Exception caught inside exception handler: ' . $e2->__toString();
} else {
$message .= "Exception caught inside exception handler.\n\n" .
}
}
} else {
- $message = "Unexpected non-MediaWiki exception encountered, of type \"" . get_class( $e ) . "\"\n" .
- $e->__toString() . "\n";
+ $message = "Unexpected non-MediaWiki exception encountered, of type \"" . get_class( $e ) . "\"";
if ( $wgShowExceptionDetails ) {
- $message .= "\n" . $e->getTraceAsString() . "\n";
+ $message .= "\nexception '" . get_class( $e ) . "' in " . $e->getFile() . ":" . $e->getLine() . "\nStack trace:\n" . self::formatRedactedTrace( $e ) . "\n";
}
if ( $cmdLine ) {
// Exit value should be nonzero for the benefit of shell jobs
exit( 1 );
}
+
+ /**
+ * Get the stack trace from the exception as a string, redacting certain function arguments in the process
+ * @param Exception $e The exception
+ * @return string The stack trace as a string
+ */
+ public static function formatRedactedTrace( Exception $e ) {
+ global $wgRedactedFunctionArguments;
+ $finalExceptionText = '';
+
+ foreach ( $e->getTrace() as $i => $call ) {
+ $checkFor = array();
+ if ( isset( $call['class'] ) ) {
+ $checkFor[] = $call['class'] . '::' . $call['function'];
+ foreach ( class_parents( $call['class'] ) as $parent ) {
+ $checkFor[] = $parent . '::' . $call['function'];
+ }
+ } else {
+ $checkFor[] = $call['function'];
+ }
+
+ foreach ( $checkFor as $check ) {
+ if ( isset( $wgRedactedFunctionArguments[$check] ) ) {
+ foreach ( (array)$wgRedactedFunctionArguments[$check] as $argNo ) {
+ $call['args'][$argNo] = 'REDACTED';
+ }
+ }
+ }
+
+ $finalExceptionText .= "#{$i} {$call['file']}({$call['line']}): ";
+ if ( isset( $call['class'] ) ) {
+ $finalExceptionText .= $call['class'] . $call['type'] . $call['function'];
+ } else {
+ $finalExceptionText .= $call['function'];
+ }
+ $args = array();
+ foreach ( $call['args'] as $arg ) {
+ if ( is_object( $arg ) ) {
+ $args[] = 'Object(' . get_class( $arg ) . ')';
+ } elseif( is_array( $arg ) ) {
+ $args[] = 'Array';
+ } else {
+ $args[] = var_export( $arg, true );
+ }
+ }
+ $finalExceptionText .= '(' . implode( ', ', $args ) . ")\n";
+ }
+ return $finalExceptionText . '#' . ( $i + 1 ) . ' {main}';
+ }
}
'revisionyear',
'revisiontimestamp',
'revisionuser',
+ 'revisionsize',
'subpagename',
'subpagenamee',
'talkspace',
*/
static function isUtf8( $value, $disableMbstring = false ) {
$value = (string)$value;
- if ( preg_match( "/[\x80-\xff]/S", $value ) === 0 ) {
- // String contains only ASCII characters, has to be valid
- return true;
- }
// If the mbstring extension is loaded, use it. However, before PHP 5.4, values above
// U+10FFFF are incorrectly allowed, so we have to check for them separately.
( $newPHP || preg_match( "/\xf4[\x90-\xbf]|[\xf5-\xff]/S", $value ) === 0 );
}
+ if ( preg_match( "/[\x80-\xff]/S", $value ) === 0 ) {
+ // String contains only ASCII characters, has to be valid
+ return true;
+ }
+
// PCRE implements repetition using recursion; to avoid a stack overflow (and segfault)
// for large input, we check for invalid sequences (<= 5 bytes) rather than valid
// sequences, which can be as long as the input string is. Multiple short regexes are
protected function feedItem( $row ) {
$title = Title::makeTitle( intval( $row->page_namespace ), $row->page_title );
- if ( $title && $title->userCan( 'read' ) ) {
+ if ( $title && $title->userCan( 'read', $this->getUser() ) ) {
$date = $row->rev_timestamp;
$comments = $title->getTalkPage()->getFullURL();
$revision = Revision::newFromRow( $row );
* @param array $what what updates to perform
*/
public function doUpdates( $what = array( 'core', 'extensions', 'stats' ) ) {
- global $wgVersion, $wgLocalisationCacheConf;
+ global $wgVersion;
$this->db->begin( __METHOD__ );
$what = array_flip( $what );
$this->checkStats();
}
- if ( isset( $what['purge'] ) ) {
- $this->purgeCache();
-
- if ( $wgLocalisationCacheConf['manualRecache'] ) {
- $this->rebuildLocalisationCache();
- }
- }
-
$this->setAppliedUpdates( $wgVersion, $this->updates );
if ( $this->fileHandle ) {
'config-help-restart' => 'Czy chcesz usunąć wszystkie zapisane dane i uruchomić ponownie proces instalacji?',
'config-restart' => 'Tak, zacznij od nowa',
'config-welcome' => '=== Sprawdzenie środowiska instalacji ===
-Wykonywane są podstawowe testy sprawdzające czy to środowisko jest odpowiednie dla instalacji MediaWiki.
-Jeśli potrzebujesz pomocy podczas instalacji załącz wyniki tych testów.',
+Teraz zostaną wykonane podstawowe testy sprawdzające czy to środowisko jest odpowiednie dla instalacji MediaWiki.
+Jeśli potrzebujesz pomocy podczas instalacji, załącz wyniki tych testów.',
'config-copyright' => "=== Prawa autorskie i warunki użytkowania ===
$1
$page = $title->getPrefixedText();
$length = 0;
- if ( $title->equals( $parser->getTitle() )
- && $parser->mInputSize !== false
- ) {
- # We are on current page (and not in PST), so
- # take length of input to parser.
- $length = $parser->mInputSize;
- } elseif ( isset( $cache[$page] ) ) {
+ if ( isset( $cache[$page] ) ) {
$length = $cache[$page];
} elseif ( $parser->incrementExpensiveFunctionCount() ) {
$rev = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
var $mRevisionId; # ID to display in {{REVISIONID}} tags
var $mRevisionTimestamp; # The timestamp of the specified revision ID
var $mRevisionUser; # User to display in {{REVISIONUSER}} tag
+ var $mRevisionSize; # Size to display in {{REVISIONSIZE}} variable
var $mRevIdForTs; # The revision ID which was used to fetch the timestamp
var $mInputSize = false; # For {{PAGESIZE}} on current page.
$this->mLinkHolders = new LinkHolderArray( $this );
$this->mLinkID = 0;
$this->mRevisionObject = $this->mRevisionTimestamp =
- $this->mRevisionId = $this->mRevisionUser = null;
+ $this->mRevisionId = $this->mRevisionUser = $this->mRevisionSize = null;
$this->mVarCache = array();
$this->mUser = null;
$this->mLangLinkLanguages = array();
$oldRevisionObject = $this->mRevisionObject;
$oldRevisionTimestamp = $this->mRevisionTimestamp;
$oldRevisionUser = $this->mRevisionUser;
+ $oldRevisionSize = $this->mRevisionSize;
if ( $revid !== null ) {
$this->mRevisionId = $revid;
$this->mRevisionObject = null;
$this->mRevisionTimestamp = null;
$this->mRevisionUser = null;
+ $this->mRevisionSize = null;
}
wfRunHooks( 'ParserBeforeStrip', array( &$this, &$text, &$this->mStripState ) );
$this->mRevisionObject = $oldRevisionObject;
$this->mRevisionTimestamp = $oldRevisionTimestamp;
$this->mRevisionUser = $oldRevisionUser;
+ $this->mRevisionSize = $oldRevisionSize;
$this->mInputSize = false;
wfProfileOut( $fname );
wfProfileOut( __METHOD__ );
wfDebug( __METHOD__ . ": {{REVISIONUSER}} used, setting vary-revision...\n" );
$value = $this->getRevisionUser();
break;
+ case 'revisionsize':
+ # Let the edit saving system know we should parse the page
+ # *after* a revision ID has been assigned. This is for null edits.
+ $this->mOutput->setFlag( 'vary-revision' );
+ wfDebug( __METHOD__ . ": {{REVISIONSIZE}} used, setting vary-revision...\n" );
+ $value = $this->getRevisionSize();
+ break;
case 'namespace':
$value = str_replace( '_', ' ', $wgContLang->getNsText( $this->mTitle->getNamespace() ) );
break;
return $this->mRevisionUser;
}
+ /**
+ * Get the size of the revision
+ *
+ * @return int|null revision size
+ */
+ function getRevisionSize() {
+ if ( is_null( $this->mRevisionSize ) ) {
+ $revObject = $this->getRevisionObject();
+
+ # if this variable is subst: the revision id will be blank,
+ # so just use the parser input size, because the own substituation
+ # will change the size.
+ if ( $revObject ) {
+ $this->mRevisionSize = $revObject->getSize();
+ } elseif ( $this->ot['wiki'] || $this->mOptions->getIsPreview() ) {
+ $this->mRevisionSize = $this->mInputSize;
+ }
+ }
+ return $this->mRevisionSize;
+ }
+
/**
* Mutator for $mDefaultSort
*
$xml = UtfNormal::cleanUp( $xml );
// 1 << 19 == XML_PARSE_HUGE, needed so newer versions of libxml2 don't barf when the XML is >256 levels deep
$result = $dom->loadXML( $xml, 1 << 19 );
- if ( !$result ) {
- wfProfileOut( __METHOD__ . '-loadXML' );
- if ( $cacheable ) {
- wfProfileOut( __METHOD__ . '-cacheable' );
- }
- wfProfileOut( __METHOD__ );
- throw new MWException( __METHOD__ . ' generated invalid XML' );
- }
}
- $obj = new PPNode_DOM( $dom->documentElement );
+ if ( $result ) {
+ $obj = new PPNode_DOM( $dom->documentElement );
+ }
wfProfileOut( __METHOD__ . '-loadXML' );
+
if ( $cacheable ) {
wfProfileOut( __METHOD__ . '-cacheable' );
}
+
wfProfileOut( __METHOD__ );
+
+ if ( !$result ) {
+ throw new MWException( __METHOD__ . ' generated invalid XML' );
+ }
return $obj;
}
'tog-extendwatchlist' => 'Astenn ar roll evezhiañ a-benn diskouez an holl gemmoù ha neket ar re ziwezhañ hepken.',
'tog-usenewrc' => "Diskouez ar c'hemmoù nevez en ur feson kempennoc'h (rekis eo JavaScript)",
'tog-numberheadings' => 'Niverenniñ emgefre an titloù',
-'tog-showtoolbar' => 'Diskouez ar varrenn gant ar meuzioù skridaozañ',
+'tog-showtoolbar' => 'Diskouez ar varrenn ostilhoù aozañ',
'tog-editondblclick' => 'Daouglikañ evit kemmañ pajennoù',
'tog-editsection' => 'Kemmañ ur rann dre al liammoù [kemmañ]',
'tog-editsectiononrightclick' => 'Kemmañ ur rann dre glikañ a-zehou<br /> war titl ar rann',
'tog-extendwatchlist' => 'Proširi spisak praćenja za pogled svih izmjena, ne samo nedavnih',
'tog-usenewrc' => 'Grupiraj izmjene po stranicama sa nedavnih izmjena i praćenih članaka',
'tog-numberheadings' => 'Automatski numeriši podnaslove',
-'tog-showtoolbar' => 'Prikaži dugmiće za izmjene (JavaScript)',
+'tog-showtoolbar' => 'Prikaži traku s alatkama za uređivanje',
'tog-editondblclick' => 'Izmijeni stranice dvostrukim klikom',
'tog-editsection' => 'Omogući da mijenjam pojedinačne odjeljke putem [uredi] linka',
'tog-editsectiononrightclick' => 'Uključite uređivanje odjeljka sa pritiskom na desno dugme miša u naslovu odjeljka',
'newwindow' => '(otvara se u novom prozoru)',
'cancel' => 'Poništite',
'moredotdotdot' => 'Još...',
-'morenotlisted' => 'Više nije prikazano...',
+'morenotlisted' => 'Ovaj spisak nije kompletan.',
'mypage' => 'Korisnička stranica',
'mytalk' => 'Razgovor',
'anontalk' => 'Razgovor za ovu IP adresu',
'upload_source_file' => ' (datoteka na Vašem računaru)',
# Special:ListFiles
-'listfiles-summary' => 'Ova posebna stranica prikazuje sve postavljene datoteke.
-Kada je filtrirana od strane korisnika, prikazane su samo datoteke ako je korisnik postavio posljednju verziju te datoteke.',
+'listfiles-summary' => 'Ova posebna stranica prikazuje sve postavljene datoteke.',
'listfiles_search_for' => 'Traži medije po imenu:',
'imgfile' => 'datoteka',
'listfiles' => 'Spisak slika',
'right-editusercssjs' => "Editar els fitxers de configuració CSS i JS d'altres usuaris",
'right-editusercss' => "Editar els fitxers de configuració CSS d'altres usuaris",
'right-edituserjs' => "Editar els fitxers de configuració JS d'altres usuaris",
+'right-viewmywatchlist' => 'Mostra la llista de seguiment pròpia',
+'right-editmyoptions' => 'Edita les pròpies preferències',
'right-rollback' => "Revertir ràpidament l'últim editor d'una pàgina particular",
'right-markbotedits' => 'Marcar les reversions com a edicions de bot',
'right-noratelimit' => "No veure's afectat pels límits d'accions",
'action-userrights-interwiki' => "modificar permisos d'usuari en altres wikis",
'action-siteadmin' => 'bloquejar o desbloquejar la base de dades',
'action-sendemail' => 'enviar missatges de correu',
+'action-editmywatchlist' => 'edita la llista de seguiment',
+'action-viewmywatchlist' => 'mostra la llista de seguiment',
+'action-viewmyprivateinfo' => 'mostra la informació personal',
+'action-editmyprivateinfo' => 'edita la informació personal',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|canvi|canvis}}',
'listfiles_size' => 'Mida (octets)',
'listfiles_description' => 'Descripció',
'listfiles_count' => 'Versions',
+'listfiles-show-all' => 'Inclou versions antigues de les imatges',
'listfiles-latestversion' => 'Versió actual',
'listfiles-latestversion-yes' => 'Sí',
'randomincategory' => 'Pàgina aleatòria en la categoria',
'randomincategory-invalidcategory' => '«$1» no és un nom de categoria vàlid.',
'randomincategory-nopages' => 'No hi ha pàgines a la categoria [[:Category:$1|$1]].',
+'randomincategory-selectcategory' => "Obté una pàgina a l'atzar de la categoria: $1 $2.",
+'randomincategory-selectcategory-submit' => 'Vés-hi',
# Random redirect
'randomredirect' => "Redirecció a l'atzar",
'thumbnail-more' => 'Amplia',
'filemissing' => 'Fitxer inexistent',
'thumbnail_error' => "S'ha produït un error en crear la miniatura: $1",
+'thumbnail_error_remote' => "Missatge d'error de $1:
+$2",
'djvu_page_error' => "La pàgina DjVu està fora de l'abast",
'djvu_no_xml' => "No s'ha pogut recollir l'XML per al fitxer DjVu",
'thumbnail-temp-create' => "No s'ha pogut creat el fitxer de miniatura temporal",
'version-entrypoints-header-url' => 'URL',
# Special:Redirect
+'redirect' => 'Redirigeix per fitxer, usuari o ID de la revisió',
+'redirect-legend' => 'Redirigeix a un fitxer o a una pàgina',
'redirect-submit' => 'Vés-hi',
+'redirect-lookup' => 'Consulta:',
'redirect-value' => 'Valor:',
'redirect-user' => "ID d'usuari",
+'redirect-revision' => 'Revisió de la pàgina',
+'redirect-file' => 'Nom del fitxer',
'redirect-not-exists' => "No s'ha trobat el valor",
# Special:FileDuplicateSearch
'tags' => 'Etiquetes de canvi vàlides',
'tag-filter' => "Filtre d'[[Special:Tags|etiquetes]]:",
'tag-filter-submit' => 'Filtra',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetes}}]]: $2)',
'tags-title' => 'Etiquetes',
'tags-intro' => 'Aquesta pàgina llista les etiquetes amb les què el programari pot marcar una modificació, i llur significat.',
'tags-tag' => "Nom de l'etiqueta",
'dberr-problems' => 'Ho sentim. Aquest lloc web està experimentant dificultats tècniques.',
'dberr-again' => 'Intenteu esperar uns minuts i tornar a carregar.',
'dberr-info' => '(No es pot contactar amb el servidor de dades: $1)',
+'dberr-info-hidden' => '(No es pot contactar amb el servidor de la base de dades)',
'dberr-usegoogle' => 'Podeu intentar fer la cerca via Google mentrestant.',
'dberr-outofdate' => 'Tingueu en compte que la seva indexació del nostre contingut pot no estar actualitzada.',
'dberr-cachederror' => 'A continuació hi ha una còpia emmagatzemada de la pàgina demanada, que pot no estar actualitzada.',
# Edit page toolbar
'bold_sample' => 'Дерстино до йоза',
'bold_tip' => 'Дерстино до йоза',
-'italic_sample' => 'Ð\9aÑ\83Ñ\80Ñ\81еттан до йоза',
-'italic_tip' => 'Ð\9aÑ\83Ñ\80Ñ\81еттан до йоза',
+'italic_sample' => 'Сеттан до йоза',
+'italic_tip' => 'Сеттан до йоза',
'link_sample' => 'Хьажориган коьрта могlа',
'link_tip' => 'Чоьхьа хьажориг',
'extlink_sample' => 'http://www.example.com хьажориг корта',
'pageinfo-redirects-name' => 'Počet přesměrování na tuto stránku',
'pageinfo-subpages-name' => 'Podstránky této stránky',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|přesměrování}}; $3 {{PLURAL:$3|nepřesměrování}})',
-'pageinfo-firstuser' => 'Zakladatel stránky',
+'pageinfo-firstuser' => 'Stránku vytvořil',
'pageinfo-firsttime' => 'Datum založení stránky',
-'pageinfo-lastuser' => 'Nejnovější editor',
-'pageinfo-lasttime' => 'Datum nejnovější editace',
+'pageinfo-lastuser' => 'Naposledy editoval',
+'pageinfo-lasttime' => 'Datum poslední editace',
'pageinfo-edits' => 'Celkový počet editací',
'pageinfo-authors' => 'Celkový počet různých autorů',
'pageinfo-recent-edits' => 'Počet nedávných ($1) editací',
'revisionyear' => array( 1, 'REVISIONYEAR' ),
'revisiontimestamp' => array( 1, 'REVISIONTIMESTAMP' ),
'revisionuser' => array( 1, 'REVISIONUSER' ),
+ 'revisionsize' => array( 1, 'REVISIONSIZE' ),
'plural' => array( 0, 'PLURAL:' ),
'fullurl' => array( 0, 'FULLURL:' ),
'fullurle' => array( 0, 'FULLURLE:' ),
'shortpages' => 'Lühikesed leheküljed',
'longpages' => 'Pikad leheküljed',
'deadendpages' => 'Edasipääsuta leheküljed',
-'deadendpagestext' => 'Järgmised leheküljed ei viita ühelegi teisele viki leheküljele.',
+'deadendpagestext' => 'Järgmised leheküljed ei viita ühelegi teisele {{GRAMMAR:genitive|{{SITENAME}}}} leheküljele.',
'protectedpages' => 'Kaitstud leheküljed',
'protectedpages-indef' => 'Ainult määramata ajani kaitstud',
'protectedpages-cascade' => 'Ainult kaskaadkaitsega',
'filerevert-legend' => 'Tiedoston palautus',
'filerevert-intro' => '<span class="plainlinks">Olet palauttamassa tiedostoa \'\'\'[[Media:$1|$1]]\'\'\' [$4 versioon, joka luotiin $2 kello $3].</span>',
'filerevert-comment' => 'Syy',
-'filerevert-defaultcomment' => 'Palautettiin versioon, joka luotiin $1 kello $2',
+'filerevert-defaultcomment' => 'Palautettiin versioon, joka luotiin $1 kello $2 (UTC)',
'filerevert-submit' => 'Palauta',
'filerevert-success' => '<span class="plainlinks">\'\'\'[[Media:$1|$1]]\'\'\' on palautettu [$4 versioon, joka luotiin $2 kello $3].</span>',
'filerevert-badversion' => 'Tiedostosta ei ole luotu versiota kyseisellä ajan hetkellä.',
'recentchanges' => 'Friss változtatások',
'recentchanges-legend' => 'A friss változtatások beállításai',
'recentchanges-summary' => 'Ezen a lapon a wikiben történt legutóbbi fejleményeket lehet nyomon követni.',
+'recentchanges-noresult' => 'A megadott időszakban nincs a feltételeknek megfelelő szerkesztés.',
'recentchanges-feed-description' => 'Kövesd a wiki friss változtatásait ezzel a hírcsatornával.',
'recentchanges-label-newpage' => 'Ezzel a szerkesztéssel egy új lap jött létre',
'recentchanges-label-minor' => 'Ez egy apró szerkesztés',
# Special:ResetTokens
'resettokens' => 'Riamposté ij geton',
+'resettokens-text' => "Ambelessì a peul riamposté ij geton ch'a permëtto d'acede a chèich dàit privà associà a sò cont.
+
+A dovrìa felo si për asar chiel a l'ha partagiaje con cheidun o si sò cont a l'é stàit compromëttù.",
+'resettokens-no-tokens' => 'A-i é gnun geton da riamposté.',
+'resettokens-legend' => 'Riamposté ij geton.',
+'resettokens-tokens' => 'Geton:',
+'resettokens-token-label' => '$1 (valor atual: $2)',
+'resettokens-watchlist-token' => "Geton për ël fluss an sl'aragnà (Atom/RSS) ëd [[Special:Watchlist|modìfiche a le pàgine che as ten sot-euj]]",
+'resettokens-done' => 'Geton riampostà.',
+'resettokens-resetbutton' => 'Riamposté ij geton selessionà',
# Edit page toolbar
'bold_sample' => 'Test an grassèt',
'link_tip' => 'Anliura interna',
'extlink_sample' => "http://www.example.com tìtol dl'anliura",
'extlink_tip' => 'Anliura esterna (che as visa dë buté ël prefiss http://)',
-'headline_sample' => "Antestassion dl'artìcol",
+'headline_sample' => 'Test dël tìtol',
'headline_tip' => 'Antestassion dë scond livel',
-'nowiki_sample' => 'Che a buta ël test nen formatà ambelessì',
-'nowiki_tip' => 'Lassé un tòch ëd test fòra dla formatassion dla wiki',
+'nowiki_sample' => 'Che a buta ël test brut ambelessì',
+'nowiki_tip' => 'Lassé un tòch ëd test fòra dla sintassi dla wiki',
'image_sample' => 'Esempi.jpg',
'image_tip' => 'Figura anglobà ant ël test',
'media_sample' => 'Esempi.ogg',
'pageswithprop-text' => 'Здесь перечислены страницы, у которых были вручную переопределены отдельные свойства.',
'pageswithprop-prop' => 'Название свойства:',
'pageswithprop-submit' => 'Найти',
-'pageswithprop-prophidden-long' => 'длинное значение текстового свойства скрыто ($1 килобайт)',
+'pageswithprop-prophidden-long' => 'длинное значение текстового свойства скрыто ($1)',
'pageswithprop-prophidden-binary' => 'значение двоичного свойства скрыто ($1)',
'doubleredirects' => 'Двойные перенаправления',
'category_header' => 'Странице у категорији „$1“',
'subcategories' => 'Поткатегорије',
'category-media-header' => 'Датотеке у категорији „$1“',
-'category-empty' => "''Ова категорија тренутно не садржи странице или датотеке.''",
+'category-empty' => "<div style=\"margin:2em 1em 0 1em; padding:0.5em; border:1px solid #AAA; text-align:center;\">''Ова категорија тренутно не садржи странице или датотеке.''</div>",
'hidden-categories' => '{{PLURAL:$1|Сакривена категорија|Сакривене категорије}}',
'hidden-category-category' => 'Сакривене категорије',
'category-subcat-count' => '{{PLURAL:$2|Ова категорија садржи само следећу поткатегорију.|Ова категорија има {{PLURAL:$1|следећу поткатегорију|следеће $1 поткатегорије|следећих $1 поткатегорија}}, од укупно $2.}}',
'category_header' => 'Stranice u kategoriji „$1“',
'subcategories' => 'Potkategorije',
'category-media-header' => 'Datoteke u kategoriji „$1“',
-'category-empty' => "''Ova kategorija trenutno ne sadrži stranice ili datoteke.''",
+'category-empty' => "<div style=\"margin:2em 1em 0 1em; padding:0.5em; border:1px solid #AAA; text-align:center;\">''Ova kategorija trenutno ne sadrži stranice ili datoteke.''</div>",
'hidden-categories' => '{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}}',
'hidden-category-category' => 'Sakrivene kategorije',
'category-subcat-count' => '{{PLURAL:$2|Ova kategorija sadrži samo sledeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|sledeću potkategoriju|sledeće $1 potkategorije|sledećih $1 potkategorija}}, od ukupno $2.}}',
'prefs-files' => 'Dosyalar',
'prefs-custom-css' => 'Özel CSS',
'prefs-custom-js' => 'Özel JS',
-'prefs-common-css-js' => 'Tüm kaplamalar için paylaşılan CSS/JS:',
+'prefs-common-css-js' => 'Tüm temalar için paylaşılan CSS/JS:',
'prefs-reset-intro' => 'Bu sayfayı tercihlerinizi site varsayılanına döndürmek için kullanabilirsiniz. Bu geri alınamaz.',
'prefs-emailconfirm-label' => 'E-posta doğrulaması:',
'youremail' => 'E-posta:',
$1 {{PLURAL:$1|karakterin|karakterin}} altında olmalı.',
'yourgender' => 'Nasıl açıklamayı tercih edersiniz?',
'gender-unknown' => 'Söylemek istemiyorsanız',
-'gender-male' => 'Erkek',
+'gender-male' => 'Wiki düzenlemelerinde kadın olarak',
'gender-female' => 'Bayan',
'prefs-help-gender' => 'Bu tercih ayarı isteğe bağlıdır.
Yazılımda söz değerlerinin başlarında bulunan cinsiyete uygun gramerler için kullanılır.
* @author Reedy
* @author Wu-chinese.com
* @author Yfdyh000
+ * @author 十弌
*/
$fallback = 'zh-hans';
'tog-extendwatchlist' => '扩展监控列表,显示所有改动,而弗仅仅是最近个',
'tog-usenewrc' => '使用强化版个近段辰光个改动(JavaScript)',
'tog-numberheadings' => '标题自动编号',
-'tog-showtoolbar' => '显示编辑工具条(JavaScript)',
-'tog-editondblclick' => '双击个辰光编辑页面(JavaScript)',
+'tog-showtoolbar' => '顯示編寫傢伙欄',
+'tog-editondblclick' => '雙捺來編寫頁面',
'tog-editsection' => '允许通过点击【编辑】链接来编辑段落',
-'tog-editsectiononrightclick' => '允许右击标题编辑段落(JavaScript)',
+'tog-editsectiononrightclick' => '用右捺標題編輯段落',
'tog-showtoc' => '显示目录(针对超过三只标题个页面)',
'tog-rememberpassword' => '来许箇台电脑上记牢我个密码(可维持$1{{PLURAL:$1|日|日}})',
'tog-watchcreations' => '拿我创建个页面添加到我个监控列表里向',
# General errors
'error' => '错误',
'databaseerror' => '数据库错误',
+'databaseerror-text' => '一個數據庫討信發生。
+嘸數說明一個bug徠軟件裏向。',
+'databaseerror-textcl' => '一個數據庫討信賺爻發生。',
+'databaseerror-query' => '討信:$1',
+'databaseerror-error' => '賺爻:$1',
'laggedslavemode' => '警告: 页面可能弗包含最近个更新。',
'readonly' => '数据库锁定',
'enterlockreason' => '请输入锁定个原因,包括预计解锁个辰光',
'yourlanguage' => '语言:',
'yournick' => '绰号:',
'badsig' => '无效原始签名;检查 HTML 标签。',
+'gender-unknown' => '我弗想講',
'email' => '电子邮件',
'prefs-help-email' => '电子邮件是备选个,垃拉侬忘记密码个情况下头可以用得来重置密码。
侬也可以让别人家通过侬个用户页或者讨论页来联系侬。',
'newpageletter' => '新',
'boteditletter' => '机',
'newsectionsummary' => '/* $1 */ 新段落',
-'rc-enhanced-expand' => '显示细节(需要JavaScript支持)',
+'rc-enhanced-expand' => '展示零碎',
'rc-enhanced-hide' => '拿细节囥脱',
# Recent changes linked
# Special:SpecialPages
'specialpages' => '特殊页面',
+# Database error messages
+'dberr-info-hidden' => '(數據庫服務器連弗上)',
+
# New logging system
'revdelete-restricted' => '已将限制应用到管理员',
'revdelete-unrestricted' => '已移除对管理员个限制',
rc_this_oldid INT DEFAULT 0,
rc_last_oldid INT DEFAULT 0,
rc_type tinyint DEFAULT 0,
- rc_moved_to_ns BIT DEFAULT 0,
- rc_moved_to_title NVARCHAR(255) DEFAULT '',
rc_patrolled BIT DEFAULT 0,
rc_ip NCHAR(40) DEFAULT '',
rc_old_len INT DEFAULT 0,
rc_this_oldid NUMBER DEFAULT 0 NOT NULL,
rc_last_oldid NUMBER DEFAULT 0 NOT NULL,
rc_type CHAR(1) DEFAULT '0' NOT NULL,
- rc_moved_to_ns NUMBER DEFAULT 0 NOT NULL,
- rc_moved_to_title VARCHAR2(255),
rc_patrolled CHAR(1) DEFAULT '0' NOT NULL,
rc_ip VARCHAR2(15),
rc_old_len NUMBER,
rc_this_oldid INTEGER NOT NULL,
rc_last_oldid INTEGER NOT NULL,
rc_type SMALLINT NOT NULL DEFAULT 0,
- rc_moved_to_ns SMALLINT,
- rc_moved_to_title TEXT,
rc_patrolled SMALLINT NOT NULL DEFAULT 0,
rc_ip CIDR,
rc_old_len INTEGER,
--- /dev/null
+<?php
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Fixes all rows affected by https://bugzilla.wikimedia.org/show_bug.cgi?id=37714
+ */
+class TidyUpBug37714 extends Maintenance {
+ public function execute() {
+ // Search for all log entries which are about changing the visability of other log entries.
+ $result = wfGetDB( DB_SLAVE )->select(
+ 'logging',
+ array( 'log_id', 'log_params' ),
+ array(
+ 'log_type' => array( 'suppress', 'delete' ),
+ 'log_action' => 'event',
+ 'log_namespace' => NS_SPECIAL,
+ 'log_title' => SpecialPage::getTitleFor( 'Log' )->getText()
+ ),
+ __METHOD__
+ );
+
+ foreach ( $result as $row ) {
+ $paramLines = explode( "\n", $row->log_params );
+ $ids = explode( ',', $paramLines[0] ); // Array dereferencing is PHP >= 5.4 :(
+ $result = wfGetDB( DB_SLAVE )->select( // Work out what log entries were changed here.
+ 'logging',
+ 'log_type',
+ array( 'log_id' => $ids ),
+ __METHOD__,
+ 'DISTINCT'
+ );
+ if ( $result->numRows() === 1 ) {
+ // If there's only one type, the target title can be set to include it.
+ $logTitle = SpecialPage::getTitleFor( 'Log', $result->current()->log_type )->getText();
+ $this->output( 'Set log_title to "' . $logTitle . '" for log entry ' . $row->log_id . ".\n" );
+ wfGetDB( DB_MASTER )->update(
+ 'logging',
+ array( 'log_title' => $logTitle ),
+ array( 'log_id' => $row->log_id ),
+ __METHOD__
+ );
+ wfWaitForSlaves();
+ }
+ }
+ }
+}
+
+$maintClass = 'TidyUpBug37714';
+require_once RUN_MAINTENANCE_IF_MAIN;
$updates[] = 'noschema';
}
$updates[] = 'stats';
-
- if ( !$this->hasOption( 'nopurge' ) ) {
- $updates[] = 'purge';
- }
}
$updater = DatabaseUpdater::newForDb( $db, $shared, $this );
$redirectedLocation = false;
if ( !$isTemp ) {
// Check for file redirect
- if ( $isOld ) {
- // Since redirects are associated with pages, not versions of files,
- // we look for the most current version to see if its a redirect.
- $possibleRedirFile = RepoGroup::singleton()->getLocalRepo()->findFile( $img->getName() );
- } else {
- $possibleRedirFile = RepoGroup::singleton()->getLocalRepo()->findFile( $fileName );
- }
- if ( $possibleRedirFile && !is_null( $possibleRedirFile->getRedirected() ) ) {
- $redirTarget = $possibleRedirFile->getName();
+ // Since redirects are associated with pages, not versions of files,
+ // we look for the most current version to see if its a redirect.
+ $possRedirFile = RepoGroup::singleton()->getLocalRepo()->findFile( $img->getName() );
+ if ( $possRedirFile && !is_null( $possRedirFile->getRedirected() ) ) {
+ $redirTarget = $possRedirFile->getName();
$targetFile = wfLocalFile( Title::makeTitleSafe( NS_FILE, $redirTarget ) );
if ( $targetFile->exists() ) {
$newThumbName = $targetFile->thumbName( $params );
if ( $isOld ) {
- $newThumbUrl = $targetFile->getArchiveThumbUrl( $bits[0] . '!' . $targetFile->getName(), $newThumbName );
+ $newThumbUrl = $targetFile->getArchiveThumbUrl(
+ $bits[0] . '!' . $targetFile->getName(), $newThumbName );
} else {
$newThumbUrl = $targetFile->getThumbUrl( $newThumbName );
}