| Index: trunk/extensions/AbuseFilter/SpecialAbuseLog.php |
| — | — | @@ -229,9 +229,21 @@ |
| 230 | 230 | |
| 231 | 231 | $title = Title::makeTitle( $row->afl_namespace, $row->afl_title ); |
| 232 | 232 | |
| 233 | | - $user = $sk->userLink( $row->afl_user, $row->afl_user_text ) . |
| 234 | | - $sk->userToolLinks( $row->afl_user, $row->afl_user_text ); |
| | 233 | + if (!$row->afl_wiki) { |
| | 234 | + $pageLink = $sk->link( $title ); |
| | 235 | + } else { |
| | 236 | + $pageLink = WikiMap::makeForeignLink( $row->afl_wiki, $row->afl_title ); |
| | 237 | + } |
| 235 | 238 | |
| | 239 | + if (!$row->afl_wiki) { |
| | 240 | + // Local user |
| | 241 | + $user = $sk->userLink( $row->afl_user, $row->afl_user_text ) . |
| | 242 | + $sk->userToolLinks( $row->afl_user, $row->afl_user_text ); |
| | 243 | + } else { |
| | 244 | + $user = WikiMap::foreignUserLink( $row->afl_wiki, $row->afl_user_text ); |
| | 245 | + $user .= " (".WikiMap::getWikiName( $row->afl_wiki ) . ")"; |
| | 246 | + } |
| | 247 | + |
| 236 | 248 | $description = ''; |
| 237 | 249 | |
| 238 | 250 | $timestamp = $wgLang->timeanddate( $row->afl_timestamp, true ); |
| — | — | @@ -244,13 +256,21 @@ |
| 245 | 257 | $displayActions = array(); |
| 246 | 258 | |
| 247 | 259 | foreach( $actions as $action ) { |
| 248 | | - $displayActions[] = AbuseFilter::getActionDisplay( $action );; |
| | 260 | + $displayActions[] = AbuseFilter::getActionDisplay( $action ); |
| 249 | 261 | } |
| 250 | 262 | $actions_taken = implode( ', ', $displayActions ); |
| 251 | 263 | } |
| 252 | | - |
| | 264 | + |
| | 265 | + $globalIndex = AbuseFilter::decodeGlobalName( $row->afl_filter ); |
| | 266 | + |
| 253 | 267 | global $wgOut; |
| 254 | | - $parsed_comments = $wgOut->parseInline( $row->af_public_comments ); |
| | 268 | + if ($globalIndex) { |
| | 269 | + // Pull global filter description |
| | 270 | + $parsed_comments = |
| | 271 | + $wgOut->parseInline( AbuseFilter::getGlobalFilterDescription( $globalIndex ) ); |
| | 272 | + } else { |
| | 273 | + $parsed_comments = $wgOut->parseInline( $row->af_public_comments ); |
| | 274 | + } |
| 255 | 275 | |
| 256 | 276 | if ($this->canSeeDetails()) { |
| 257 | 277 | $examineTitle = SpecialPage::getTitleFor( 'AbuseFilter', "examine/log/".$row->afl_id ); |
| — | — | @@ -262,15 +282,31 @@ |
| 263 | 283 | $examineTitle, |
| 264 | 284 | wfMsgExt( 'abusefilter-changeslist-examine', 'parseinline' ), |
| 265 | 285 | array() ); |
| 266 | | - |
| 267 | | - $description = wfMsgExt( 'abusefilter-log-detailedentry', |
| | 286 | + |
| | 287 | + if ($globalIndex) { |
| | 288 | + global $wgAbuseFilterCentralDB; |
| | 289 | + $globalURL = |
| | 290 | + WikiMap::getForeignURL( $wgAbuseFilterCentralDB, |
| | 291 | + 'Special:AbuseFilter/'.$globalIndex ); |
| | 292 | + |
| | 293 | + $linkText = wfMsgExt( 'abusefilter-log-detailedentry-global', |
| | 294 | + 'parseinline', array($globalIndex) ); |
| | 295 | + |
| | 296 | + $filterLink = $sk->makeExternalLink( $globalURL, $linkText ); |
| | 297 | + } else { |
| | 298 | + $title = SpecialPage::getTitleFor( 'AbuseFilter', $row->afl_filter ); |
| | 299 | + $linkText = wfMsgExt( 'abusefilter-log-detailedentry-local', |
| | 300 | + 'parseinline', array($row->afl_filter) ); |
| | 301 | + $filterLink = $sk->link( $title, $linkText ); |
| | 302 | + } |
| | 303 | + $description = wfMsgExt( 'abusefilter-log-detailedentry-meta', |
| 268 | 304 | array( 'parseinline', 'replaceafter' ), |
| 269 | 305 | array( |
| 270 | 306 | $timestamp, |
| 271 | 307 | $user, |
| 272 | | - $row->afl_filter, |
| | 308 | + $filterLink, |
| 273 | 309 | $row->afl_action, |
| 274 | | - $sk->link( $title ), |
| | 310 | + $pageLink, |
| 275 | 311 | $actions_taken, |
| 276 | 312 | $parsed_comments, |
| 277 | 313 | $detailsLink, |
| — | — | @@ -313,12 +349,17 @@ |
| 314 | 350 | function getQueryInfo() { |
| 315 | 351 | $conds = $this->mConds; |
| 316 | 352 | |
| 317 | | - $conds[] = 'af_id=afl_filter'; |
| 318 | | - |
| 319 | 353 | return array( |
| 320 | 354 | 'tables' => array('abuse_filter_log','abuse_filter'), |
| 321 | 355 | 'fields' => '*', |
| 322 | 356 | 'conds' => $conds, |
| | 357 | + 'join_conds' => |
| | 358 | + array( 'abuse_filter' => |
| | 359 | + array( |
| | 360 | + 'LEFT JOIN', |
| | 361 | + 'af_id=afl_filter', |
| | 362 | + ), |
| | 363 | + ), |
| 323 | 364 | ); |
| 324 | 365 | } |
| 325 | 366 | |
| Index: trunk/extensions/AbuseFilter/AbuseFilter.php |
| — | — | @@ -110,3 +110,8 @@ |
| 111 | 111 | $wgAbuseFilterUDPPrefix = 'abusefilter:'; |
| 112 | 112 | $wgAbuseFilterUDPAddress = null; |
| 113 | 113 | $wgAbuseFilterUDPPort = null; |
| | 114 | + |
| | 115 | +// Centralised filters |
| | 116 | +$wgAbuseFilterCentralDB = null; |
| | 117 | +$wgAbuseFilterIsCentral = false; |
| | 118 | + |
| Index: trunk/extensions/AbuseFilter/db_patches/patch-global_filters.sql |
| — | — | @@ -0,0 +1,7 @@ |
| | 2 | +-- Patch to add support for global filters |
| | 3 | + |
| | 4 | +ALTER TABLE /*_*/abuse_filter ADD COLUMN af_global tinyint(1) NOT NULL DEFAULT 0; |
| | 5 | + |
| | 6 | +ALTER TABLE /*_*/abuse_filter_log ADD COLUMN afl_wiki varchar(64) binary NULL; |
| | 7 | +ALTER TABLE /*_*/abuse_filter_log CHANGE COLUMN afl_filter afl_filter varchar(64) binary NOT NULL; |
| | 8 | +ALTER TABLE /*_*/abuse_filter_log ADD COLUMN afl_deleted tinyint(1) NULL; |
| Index: trunk/extensions/AbuseFilter/Views/AbuseFilterViewList.php |
| — | — | @@ -153,7 +153,9 @@ |
| 154 | 154 | 'tables' => array('abuse_filter', 'abuse_filter_action'), |
| 155 | 155 | 'fields' => array( |
| 156 | 156 | 'af_id', |
| 157 | | - '(af_enabled | af_deleted << 1) AS status', |
| | 157 | + 'af_enabled', |
| | 158 | + 'af_deleted', |
| | 159 | + 'af_global', |
| 158 | 160 | 'af_public_comments', |
| 159 | 161 | 'af_hidden', |
| 160 | 162 | 'af_hit_count', |
| — | — | @@ -220,12 +222,19 @@ |
| 221 | 223 | } |
| 222 | 224 | return htmlspecialchars( implode( ', ', $displayActions ) ); |
| 223 | 225 | case 'status': |
| 224 | | - if ($value & 2) |
| 225 | | - return wfMsgExt( 'abusefilter-deleted', 'parseinline' ); |
| 226 | | - elseif ($value & 1) |
| 227 | | - return wfMsgExt( 'abusefilter-enabled', 'parseinline' ); |
| | 226 | + $statuses = array(); |
| | 227 | + if ($row->af_deleted) |
| | 228 | + $statuses[] = wfMsgExt( 'abusefilter-deleted', 'parseinline' ); |
| | 229 | + elseif ($row->af_enabled) |
| | 230 | + $statuses[] = wfMsgExt( 'abusefilter-enabled', 'parseinline' ); |
| 228 | 231 | else |
| 229 | | - return wfMsgExt( 'abusefilter-disabled', 'parseinline' ); |
| | 232 | + $statuses[] = wfMsgExt( 'abusefilter-disabled', 'parseinline' ); |
| | 233 | + |
| | 234 | + global $wgAbuseFilterIsCentral; |
| | 235 | + if ($row->af_global && $wgAbuseFilterIsCentral) |
| | 236 | + $statuses[] = wfMsgExt( 'abusefilter-status-global', 'parseinline' ); |
| | 237 | + |
| | 238 | + return $wgLang->commaList( $statuses ); |
| 230 | 239 | case 'af_hidden': |
| 231 | 240 | $msg = $value ? 'abusefilter-hidden' : 'abusefilter-unhidden'; |
| 232 | 241 | return wfMsgExt( $msg, 'parseinline' ); |
| — | — | @@ -266,9 +275,9 @@ |
| 267 | 276 | } |
| 268 | 277 | |
| 269 | 278 | function getRowClass( $row ) { |
| 270 | | - if ($row->status & 1) { |
| | 279 | + if ($row->af_enabled) { |
| 271 | 280 | return 'mw-abusefilter-list-enabled'; |
| 272 | | - } elseif ($row->status & 2) { |
| | 281 | + } elseif ($row->af_deleted) { |
| 273 | 282 | return 'mw-abusefilter-list-deleted'; |
| 274 | 283 | } else { |
| 275 | 284 | return 'mw-abusefilter-list-disabled'; |
| Index: trunk/extensions/AbuseFilter/Views/AbuseFilterViewHistory.php |
| — | — | @@ -178,8 +178,8 @@ |
| 179 | 179 | if ($name == 'afh_flags') { |
| 180 | 180 | // This is a bit freaky, but it works. |
| 181 | 181 | // Basically, returns true if any of those filters are in the $changed array. |
| 182 | | - $filters = array( 'af_enabled', 'af_hidden', 'af_deleted' ); |
| 183 | | - if ( count( array_diff( $filters, $changed ) ) < 3 ) { |
| | 182 | + $filters = array( 'af_enabled', 'af_hidden', 'af_deleted', 'af_global' ); |
| | 183 | + if ( count( array_diff( $filters, $changed ) ) < count($filters) ) { |
| 184 | 184 | $fieldChanged = true; |
| 185 | 185 | } |
| 186 | 186 | } elseif ( in_array( $mappings[$name], $changed ) ) { |
| Index: trunk/extensions/AbuseFilter/Views/AbuseFilterViewEdit.php |
| — | — | @@ -148,6 +148,8 @@ |
| 149 | 149 | $flags[] = 'enabled'; |
| 150 | 150 | if ($newRow['af_deleted']) |
| 151 | 151 | $flags[] = 'deleted'; |
| | 152 | + if ($newRow['af_global']) |
| | 153 | + $flags[] = 'global'; |
| 152 | 154 | |
| 153 | 155 | $afh_row['afh_flags'] = implode( ",", $flags ); |
| 154 | 156 | |
| — | — | @@ -280,6 +282,10 @@ |
| 281 | 283 | // Build checkboxen |
| 282 | 284 | $checkboxes = array( 'hidden', 'enabled', 'deleted' ); |
| 283 | 285 | $flags = ''; |
| | 286 | + |
| | 287 | + global $wgAbuseFilterIsCentral; |
| | 288 | + if ($wgAbuseFilterIsCentral) |
| | 289 | + $checkboxes[] = 'global'; |
| 284 | 290 | |
| 285 | 291 | if (isset($row->af_throttled) && $row->af_throttled) { |
| 286 | 292 | global $wgAbuseFilterEmergencyDisableThreshold; |
| — | — | @@ -582,6 +588,7 @@ |
| 583 | 589 | $obj->af_pattern = ''; |
| 584 | 590 | $obj->af_enabled = 1; |
| 585 | 591 | $obj->af_hidden = 0; |
| | 592 | + $obj->af_global = 0; |
| 586 | 593 | return array( $obj, array() ); |
| 587 | 594 | } |
| 588 | 595 | |
| — | — | @@ -641,6 +648,8 @@ |
| 642 | 649 | $row->af_deleted = $wgRequest->getBool( 'wpFilterDeleted' ); |
| 643 | 650 | $row->af_enabled = $wgRequest->getBool( 'wpFilterEnabled' ) && !$row->af_deleted; |
| 644 | 651 | $row->af_hidden = $wgRequest->getBool( 'wpFilterHidden' ); |
| | 652 | + global $wgAbuseFilterIsCentral; |
| | 653 | + $row->af_global = $wgRequest->getBool( 'wpFilterGlobal' ) && $wgAbuseFilterIsCentral; |
| 645 | 654 | |
| 646 | 655 | // Actions |
| 647 | 656 | global $wgAbuseFilterAvailableActions; |
| Index: trunk/extensions/AbuseFilter/AbuseFilter.class.php |
| — | — | @@ -372,38 +372,31 @@ |
| 373 | 373 | public static function checkAllFilters( $vars ) { |
| 374 | 374 | // Fetch from the database. |
| 375 | 375 | wfProfileIn( __METHOD__ ); |
| 376 | | - $dbr = wfGetDB( DB_SLAVE ); |
| 377 | | - $res = $dbr->select( 'abuse_filter', '*', array( 'af_enabled' => 1, 'af_deleted' => 0 ) ); |
| 378 | 376 | |
| 379 | 377 | // Sampling profiler |
| 380 | 378 | $profile = rand(0,50); |
| 381 | 379 | $profile = ($profile == 1) ? true : false; |
| 382 | 380 | |
| 383 | 381 | $filter_matched = array(); |
| | 382 | + |
| | 383 | + $dbr = wfGetDB( DB_SLAVE ); |
| | 384 | + $res = $dbr->select( 'abuse_filter', '*', array( 'af_enabled' => 1, 'af_deleted' => 0 ) ); |
| 384 | 385 | |
| 385 | 386 | while ( $row = $dbr->fetchObject( $res ) ) { |
| 386 | | - if ($profile) |
| 387 | | - $startTime = microtime(true); |
| 388 | | - // Store the row somewhere convenient |
| 389 | | - self::$filters[$row->af_id] = $row; |
| 390 | | - |
| 391 | | - // Check conditions... |
| 392 | | - $pattern = trim($row->af_pattern); |
| 393 | | - if ( self::checkConditions( $pattern, $vars, true /* ignore errors */, |
| 394 | | - 'keepvars' ) ) { |
| 395 | | - // Record match. |
| 396 | | - $filter_matched[$row->af_id] = true; |
| 397 | | - } else { |
| 398 | | - // Record non-match. |
| 399 | | - $filter_matched[$row->af_id] = false; |
| 400 | | - } |
| | 387 | + $filter_matched[$row->af_id] = self::checkFilter( $row, $vars, $profile ); |
| | 388 | + } |
| | 389 | + |
| | 390 | + global $wgAbuseFilterCentralDB, $wgAbuseFilterIsCentral; |
| | 391 | + if ($wgAbuseFilterCentralDB && !$wgAbuseFilterIsCentral) { |
| | 392 | + // Global filters |
| | 393 | + $fdb = wfGetDB( DB_SLAVE, array(), $wgAbuseFilterCentralDB ); |
| | 394 | + $res = $fdb->select( 'abuse_filter', '*', |
| | 395 | + array( 'af_enabled' => 1, 'af_deleted' => 0, |
| | 396 | + 'af_global' => 1 ) ); |
| 401 | 397 | |
| 402 | | - if ($profile) { |
| 403 | | - $endTime = microtime(true); |
| 404 | | - |
| 405 | | - $timeTaken = $endTime - $startTime; |
| 406 | | - |
| 407 | | - self::recordProfilingResult( $row->af_id, $timeTaken ); |
| | 398 | + while ( $row = $fdb->fetchObject( $res ) ) { |
| | 399 | + $filter_matched["global-".$row->af_id] = |
| | 400 | + self::checkFilter( $row, $vars, $profile, 'global-' ); |
| 408 | 401 | } |
| 409 | 402 | } |
| 410 | 403 | |
| — | — | @@ -415,6 +408,37 @@ |
| 416 | 409 | return $filter_matched; |
| 417 | 410 | } |
| 418 | 411 | |
| | 412 | + public static function checkFilter( $row, $vars, $profile = false, $prefix = '' ) { |
| | 413 | + $filterID = $prefix.$row->af_id; |
| | 414 | + |
| | 415 | + if ($profile) |
| | 416 | + $startTime = microtime(true); |
| | 417 | + |
| | 418 | + // Store the row somewhere convenient |
| | 419 | + self::$filters[$filterID] = $row; |
| | 420 | + |
| | 421 | + // Check conditions... |
| | 422 | + $pattern = trim($row->af_pattern); |
| | 423 | + if ( self::checkConditions( $pattern, $vars, true /* ignore errors */, |
| | 424 | + 'keepvars' ) ) { |
| | 425 | + // Record match. |
| | 426 | + $result = true; |
| | 427 | + } else { |
| | 428 | + // Record non-match. |
| | 429 | + $result = false; |
| | 430 | + } |
| | 431 | + |
| | 432 | + if ($profile) { |
| | 433 | + $endTime = microtime(true); |
| | 434 | + |
| | 435 | + $timeTaken = $endTime - $startTime; |
| | 436 | + |
| | 437 | + self::recordProfilingResult( $row->af_id, $timeTaken ); |
| | 438 | + } |
| | 439 | + |
| | 440 | + return $result; |
| | 441 | + } |
| | 442 | + |
| 419 | 443 | public static function resetFilterProfile( $filter ) { |
| 420 | 444 | global $wgMemc; |
| 421 | 445 | $countKey = wfMemcKey( 'abusefilter', 'profile', $filter, 'count' ); |
| — | — | @@ -457,22 +481,58 @@ |
| 458 | 482 | $profile = ($curTotal / $curCount) * 1000; |
| 459 | 483 | return round( $profile, 2); // Return in ms, rounded to 2dp |
| 460 | 484 | } |
| 461 | | - |
| 462 | | - /** Returns an array [ list of actions taken by filter, error message to display, if any ] */ |
| 463 | | - public static function executeFilterActions( $filters, $title, $vars ) { |
| 464 | | - wfProfileIn( __METHOD__ ); |
| 465 | | - static $blockingActions = array( 'block', 'rangeblock', 'degroup', |
| 466 | | - 'blockautopromote' ); |
| | 485 | + |
| | 486 | + /** Utility function to decode global-$index to $index. Returns false if not global */ |
| | 487 | + public static function decodeGlobalName( $filter ) { |
| | 488 | + if ( strpos( $filter, 'global-' ) == 0 ) { |
| | 489 | + return substr( $filter, strlen('global-') ); |
| | 490 | + } |
| 467 | 491 | |
| | 492 | + return false; |
| | 493 | + } |
| | 494 | + |
| | 495 | + public static function getConsequencesForFilters( $filters ) { |
| | 496 | + $globalFilters = array(); |
| | 497 | + $localFilters = array(); |
| | 498 | + |
| | 499 | + foreach( $filters as $filter ) { |
| | 500 | + $globalIndex = self::decodeGlobalName( $filter ); |
| | 501 | + |
| | 502 | + if ($globalIndex) |
| | 503 | + $globalFilters[] = $globalIndex; |
| | 504 | + else |
| | 505 | + $localFilters[] = $filter; |
| | 506 | + } |
| | 507 | + |
| | 508 | + global $wgAbuseFilterCentralDB; |
| | 509 | + // Load local filter info |
| 468 | 510 | $dbr = wfGetDB( DB_SLAVE ); |
| 469 | 511 | // Retrieve the consequences. |
| | 512 | + $consequences = array(); |
| | 513 | + |
| | 514 | + if ( count($localFilters) ) { |
| | 515 | + $consequences = self::loadConsequencesFromDB( $dbr, $localFilters ); |
| | 516 | + } |
| | 517 | + |
| | 518 | + if ( count($globalFilters) ) { |
| | 519 | + $fdb = wfGetDB( DB_SLAVE, array(), $wgAbuseFilterCentralDB ); |
| | 520 | + $consequences = array_merge( $consequences, |
| | 521 | + self::loadConsequencesFromDB( $fdb, $globalFilters, 'global-' ) ); |
| | 522 | + } |
| | 523 | + |
| | 524 | + return $consequences; |
| | 525 | + } |
| | 526 | + |
| | 527 | + public static function loadConsequencesFromDB( $dbr, $filters, $prefix='' ) { |
| | 528 | + $actionsByFilter = array(); |
| | 529 | + foreach( $filters as $filter ) { |
| | 530 | + $actionsByFilter[$prefix.$filter] = array(); |
| | 531 | + } |
| | 532 | + |
| 470 | 533 | $res = $dbr->select( array('abuse_filter_action', 'abuse_filter'), '*', |
| 471 | 534 | array( 'af_id' => $filters ), __METHOD__, array(), |
| 472 | 535 | array( 'abuse_filter_action' => array('LEFT JOIN', 'afa_filter=af_id') ) ); |
| 473 | | - |
| 474 | | - $actionsByFilter = array_fill_keys( $filters, array() ); |
| 475 | | - $actionsTaken = array_fill_keys( $filters, array() ); |
| 476 | | - |
| | 536 | + |
| 477 | 537 | // Categorise consequences by filter. |
| 478 | 538 | global $wgAbuseFilterRestrictedActions; |
| 479 | 539 | while ( $row = $dbr->fetchObject( $res ) ) { |
| — | — | @@ -482,15 +542,27 @@ |
| 483 | 543 | ## Don't do the action |
| 484 | 544 | } elseif ( $row->afa_filter != $row->af_id ) { |
| 485 | 545 | // We probably got a NULL, as it's a LEFT JOIN. |
| 486 | | - // Don't add it anyway. |
| | 546 | + // Don't add it. |
| 487 | 547 | } else { |
| 488 | | - $actionsByFilter[$row->afa_filter][$row->afa_consequence] = array( |
| | 548 | + $actionsByFilter[$prefix.$row->afa_filter][$row->afa_consequence] = array( |
| 489 | 549 | 'action' => $row->afa_consequence, |
| 490 | 550 | 'parameters' => explode( "\n", $row->afa_parameters ) |
| 491 | 551 | ); |
| 492 | 552 | } |
| 493 | 553 | } |
| | 554 | + |
| | 555 | + return $actionsByFilter; |
| | 556 | + } |
| 494 | 557 | |
| | 558 | + /** Returns an array [ list of actions taken by filter, error message to display, if any ] */ |
| | 559 | + public static function executeFilterActions( $filters, $title, $vars ) { |
| | 560 | + wfProfileIn( __METHOD__ ); |
| | 561 | + static $blockingActions = array( 'block', 'rangeblock', 'degroup', |
| | 562 | + 'blockautopromote' ); |
| | 563 | + |
| | 564 | + $actionsByFilter = self::getConsequencesForFilters( $filters ); |
| | 565 | + $actionsTaken = array_fill_keys( $filters, array() ); |
| | 566 | + |
| 495 | 567 | wfLoadExtensionMessages( 'AbuseFilter' ); |
| 496 | 568 | |
| 497 | 569 | $messages = array(); |
| — | — | @@ -597,16 +669,13 @@ |
| 598 | 670 | |
| 599 | 671 | list( $actions_taken, $error_msg ) = self::executeFilterActions( |
| 600 | 672 | array_keys( array_filter( $filter_matched ) ), $title, $vars ); |
| 601 | | - |
| 602 | | - $var_dump = self::storeVarDump( $vars ); |
| 603 | | - $var_dump = "stored-text:$var_dump"; // To distinguish from stuff stored directly |
| | 673 | + |
| 604 | 674 | $action = $vars->getVar( 'ACTION' )->toString(); |
| 605 | 675 | |
| 606 | 676 | // Create a template |
| 607 | 677 | $log_template = array( |
| 608 | 678 | 'afl_user' => $wgUser->getId(), |
| 609 | 679 | 'afl_user_text' => $wgUser->getName(), |
| 610 | | - 'afl_var_dump' => $var_dump, |
| 611 | 680 | 'afl_timestamp' => $dbr->timestamp(wfTimestampNow()), |
| 612 | 681 | 'afl_namespace' => $title->getNamespace(), |
| 613 | 682 | 'afl_title' => $title->getDBKey(), |
| — | — | @@ -617,7 +686,7 @@ |
| 618 | 687 | $log_template['afl_user_text'] = $vars->getVar( 'accountname' )->toString(); |
| 619 | 688 | } |
| 620 | 689 | |
| 621 | | - self::addLogEntries( $actions_taken, $log_template, $action ); |
| | 690 | + self::addLogEntries( $actions_taken, $log_template, $action, $vars ); |
| 622 | 691 | |
| 623 | 692 | $error_msg = $error_msg == '' ? true : $error_msg; |
| 624 | 693 | |
| — | — | @@ -628,14 +697,21 @@ |
| 629 | 698 | return $error_msg; |
| 630 | 699 | } |
| 631 | 700 | |
| 632 | | - public static function addLogEntries( $actions_taken, $log_template, $action ) { |
| | 701 | + public static function addLogEntries( $actions_taken, $log_template, $action, $vars ) { |
| 633 | 702 | wfProfileIn( __METHOD__ ); |
| 634 | 703 | $dbw = wfGetDB( DB_MASTER ); |
| | 704 | + |
| | 705 | + $central_log_template = array( |
| | 706 | + 'afl_wiki' => wfWikiId(), |
| | 707 | + ); |
| 635 | 708 | |
| 636 | 709 | $log_rows = array(); |
| 637 | | - $logged_filters = array(); |
| | 710 | + $central_log_rows = array(); |
| | 711 | + $logged_local_filters = array(); |
| | 712 | + $logged_global_filters = array(); |
| 638 | 713 | |
| 639 | 714 | foreach( $actions_taken as $filter => $actions ) { |
| | 715 | + $globalIndex = self::decodeGlobalName( $filter ); |
| 640 | 716 | $thisLog = $log_template; |
| 641 | 717 | $thisLog['afl_filter'] = $filter; |
| 642 | 718 | $thisLog['afl_action'] = $action; |
| — | — | @@ -644,7 +720,22 @@ |
| 645 | 721 | // Don't log if we were only throttling. |
| 646 | 722 | if ( $thisLog['afl_actions'] != 'throttle' ) { |
| 647 | 723 | $log_rows[] = $thisLog; |
| 648 | | - $logged_filters[] = $filter; |
| | 724 | + |
| | 725 | + if (!$globalIndex) |
| | 726 | + $logged_local_filters[] = $filter; |
| | 727 | + |
| | 728 | + // Global logging |
| | 729 | + if ($globalIndex) { |
| | 730 | + $title = Title::makeTitle( $thisLog['afl_namespace'], |
| | 731 | + $thisLog['afl_title'] ); |
| | 732 | + $centralLog = $thisLog + $central_log_template; |
| | 733 | + $centralLog['afl_filter'] = $globalIndex; |
| | 734 | + $centralLog['afl_title'] = $title->getPrefixedText(); |
| | 735 | + $centralLog['afl_namespace'] = 0; |
| | 736 | + |
| | 737 | + $central_log_rows[] = $centralLog; |
| | 738 | + $logged_global_filters[] = $globalIndex; |
| | 739 | + } |
| 649 | 740 | } |
| 650 | 741 | } |
| 651 | 742 | |
| — | — | @@ -653,6 +744,14 @@ |
| 654 | 745 | return; |
| 655 | 746 | } |
| 656 | 747 | |
| | 748 | + // Only store the var dump if we're actually going to add log rows. |
| | 749 | + $var_dump = self::storeVarDump( $vars ); |
| | 750 | + $var_dump = "stored-text:$var_dump"; // To distinguish from stuff stored directly |
| | 751 | + |
| | 752 | + foreach( $log_rows as $index => $data ) { |
| | 753 | + $log_rows[$index]['afl_var_dump'] = $var_dump; |
| | 754 | + } |
| | 755 | + |
| 657 | 756 | wfProfileIn( __METHOD__.'-hitstats' ); |
| 658 | 757 | |
| 659 | 758 | global $wgMemc; |
| — | — | @@ -662,14 +761,35 @@ |
| 663 | 762 | |
| 664 | 763 | $dbw->insert( 'abuse_filter_log', $log_rows, __METHOD__ ); |
| 665 | 764 | |
| 666 | | - // Update hit-counter. |
| 667 | | - $dbw->update( 'abuse_filter', array( 'af_hit_count=af_hit_count+1' ), |
| 668 | | - array( 'af_id' => $logged_filters ), |
| 669 | | - __METHOD__ ); |
| | 765 | + if ( count($logged_local_filters) ) { |
| | 766 | + // Update hit-counter. |
| | 767 | + $dbw->update( 'abuse_filter', array( 'af_hit_count=af_hit_count+1' ), |
| | 768 | + array( 'af_id' => $logged_local_filters ), |
| | 769 | + __METHOD__ ); |
| | 770 | + } |
| | 771 | + |
| | 772 | + // Global stuff |
| | 773 | + if ( count($logged_global_filters) ) { |
| | 774 | + $vars->computeDBVars(); |
| | 775 | + $global_var_dump = self::storeVarDump( $vars, 'global' ); |
| | 776 | + $global_var_dump = "stored-text:$global_var_dump"; |
| | 777 | + foreach( $central_log_rows as $index => $data ) { |
| | 778 | + $central_log_rows[$index]['afl_var_dump'] = $global_var_dump; |
| | 779 | + } |
| | 780 | + |
| | 781 | + global $wgAbuseFilterCentralDB; |
| | 782 | + $fdb = wfGetDB( DB_MASTER, array(), $wgAbuseFilterCentralDB ); |
| 670 | 783 | |
| | 784 | + $fdb->insert( 'abuse_filter_log', $central_log_rows, __METHOD__ ); |
| | 785 | + |
| | 786 | + $fdb->update( 'abuse_filter', array( 'af_hit_count=af_hit_count+1' ), |
| | 787 | + array( 'af_id' => $logged_global_filters ), |
| | 788 | + __METHOD__ ); |
| | 789 | + } |
| | 790 | + |
| 671 | 791 | // Check for emergency disabling. |
| 672 | 792 | $total = $wgMemc->get( AbuseFilter::filterUsedKey() ); |
| 673 | | - self::checkEmergencyDisable( $logged_filters, $total ); |
| | 793 | + self::checkEmergencyDisable( $logged_local_filters, $total ); |
| 674 | 794 | |
| 675 | 795 | wfProfileOut( __METHOD__.'-hitstats' ); |
| 676 | 796 | |
| — | — | @@ -678,7 +798,7 @@ |
| 679 | 799 | |
| 680 | 800 | /** Store a var dump to External Storage or the text table |
| 681 | 801 | * Some of this code is stolen from Revision::insertOn and friends */ |
| 682 | | - public static function storeVarDump( $vars ) { |
| | 802 | + public static function storeVarDump( $vars, $global = false ) { |
| 683 | 803 | wfProfileIn( __METHOD__ ); |
| 684 | 804 | |
| 685 | 805 | if ( is_array( $vars ) || is_object( $vars ) ) |
| — | — | @@ -693,9 +813,12 @@ |
| 694 | 814 | } |
| 695 | 815 | |
| 696 | 816 | // Store to ES if applicable |
| 697 | | - global $wgDefaultExternalStore; |
| | 817 | + global $wgDefaultExternalStore, $wgAbuseFilterCentralDB; |
| 698 | 818 | if ($wgDefaultExternalStore) { |
| 699 | | - $text = ExternalStore::insertToDefault( $text ); |
| | 819 | + if ($global) |
| | 820 | + $text = ExternalStore::insertToForeignDefault( $text, $wgAbuseFilterCentralDB ); |
| | 821 | + else |
| | 822 | + $text = ExternalStore::insertToDefault( $text ); |
| 700 | 823 | $flags[] = 'external'; |
| 701 | 824 | |
| 702 | 825 | if (!$text) |
| — | — | @@ -704,7 +827,10 @@ |
| 705 | 828 | } |
| 706 | 829 | |
| 707 | 830 | // Store to text table |
| 708 | | - $dbw = wfGetDB( DB_MASTER ); |
| | 831 | + if ($global) |
| | 832 | + $dbw = wfGetDB( DB_MASTER, array(), $wgAbuseFilterCentralDB ); |
| | 833 | + else |
| | 834 | + $dbw = wfGetDB( DB_MASTER ); |
| 709 | 835 | $old_id = $dbw->nextSequenceValue( 'text_old_id_val' ); |
| 710 | 836 | $dbw->insert( 'text', |
| 711 | 837 | array( |
| — | — | @@ -1185,7 +1311,8 @@ |
| 1186 | 1312 | 'af_comments', |
| 1187 | 1313 | 'af_deleted', |
| 1188 | 1314 | 'af_enabled', |
| 1189 | | - 'af_hidden' |
| | 1315 | + 'af_hidden', |
| | 1316 | + 'af_global', |
| 1190 | 1317 | ); |
| 1191 | 1318 | $differences = array(); |
| 1192 | 1319 | |
| — | — | @@ -1499,4 +1626,15 @@ |
| 1500 | 1627 | RecentChange::sendToUDP( $data, $wgAbuseFilterUDPAddress, $wgAbuseFilterUDPPrefix, |
| 1501 | 1628 | $wgAbuseFilterUDPPort ); |
| 1502 | 1629 | } |
| | 1630 | + |
| | 1631 | + static function getGlobalFilterDescription( $filterID ) { |
| | 1632 | + global $wgAbuseFilterCentralDB; |
| | 1633 | + |
| | 1634 | + if (!$wgAbuseFilterCentralDB) return; |
| | 1635 | + |
| | 1636 | + $fdb = wfGetDB( DB_SLAVE, array(), $wgAbuseFilterCentralDB ); |
| | 1637 | + |
| | 1638 | + return $fdb->selectField( 'abuse_filter', 'af_public_comments', |
| | 1639 | + array( 'af_id' => $filterID ), __METHOD__ ); |
| | 1640 | + } |
| 1503 | 1641 | } |
| Index: trunk/extensions/AbuseFilter/AbuseFilterVariableHolder.php |
| — | — | @@ -67,6 +67,23 @@ |
| 68 | 68 | return $exported; |
| 69 | 69 | } |
| 70 | 70 | |
| | 71 | + /** Compute all vars which need DB access. Useful for vars which are going to be saved |
| | 72 | + * cross-wiki or used for offline analysis */ |
| | 73 | + function computeDBVars() { |
| | 74 | + static $dbTypes = array( 'links-from-wikitext-or-database', 'load-recent-authors', |
| | 75 | + 'get-page-restrictions', 'simple-user-accessor', |
| | 76 | + 'user-age', 'user-groups', 'revision-text-by-id', |
| | 77 | + 'revision-text-by-timestamp' ); |
| | 78 | + |
| | 79 | + foreach( $this->mVars as $name => $value ) { |
| | 80 | + if ($value instanceof AFComputedVariable && |
| | 81 | + in_array( $value->mMethod, $dbTypes ) ) { |
| | 82 | + $value = $value->compute( $this ); |
| | 83 | + $this->setVar( $name, $value ); |
| | 84 | + } |
| | 85 | + } |
| | 86 | + } |
| | 87 | + |
| 71 | 88 | } |
| 72 | 89 | |
| 73 | 90 | class AFComputedVariable { |
| Index: trunk/extensions/AbuseFilter/AbuseFilter.i18n.php |
| — | — | @@ -80,9 +80,11 @@ |
| 81 | 81 | 'abusefilter-log-entry' => '$1: $2 triggered an abuse filter, performing the action "$3" on $4. |
| 82 | 82 | Actions taken: $5; |
| 83 | 83 | Filter description: $6', |
| 84 | | - 'abusefilter-log-detailedentry' => '$1: $2 triggered [[Special:AbuseFilter/$3|filter $3]], performing the action "$4" on $5. |
| | 84 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 triggered $3, performing the action "$4" on $5. |
| 85 | 85 | Actions taken: $6; |
| 86 | 86 | Filter description: $7 ($8) ($9)', |
| | 87 | + 'abusefilter-log-detailedentry-global' => 'global filter $1', |
| | 88 | + 'abusefilter-log-detailedentry-local' => 'filter $1', |
| 87 | 89 | 'abusefilter-log-detailslink' => 'details', |
| 88 | 90 | 'abusefilter-log-details-legend' => 'Details for log entry $1', |
| 89 | 91 | 'abusefilter-log-details-var' => 'Variable', |
| — | — | @@ -118,6 +120,7 @@ |
| 119 | 121 | 'abusefilter-tools' => 'Abuse filter tools', |
| 120 | 122 | 'abusefilter-loglink' => 'View the abuse log', |
| 121 | 123 | 'abusefilter-return' => 'Return to filter management', |
| | 124 | + 'abusefilter-status-global' => 'Global', |
| 122 | 125 | |
| 123 | 126 | // Options form |
| 124 | 127 | 'abusefilter-list-options' => 'Options', |
| — | — | @@ -204,6 +207,7 @@ |
| 205 | 208 | 'abusefilter-edit-revert' => 'Revert actions taken by this filter', |
| 206 | 209 | 'abusefilter-edit-tools' => 'Tools:', |
| 207 | 210 | 'abusefilter-edit-test-link' => 'Test this filter against recent edits', |
| | 211 | + 'abusefilter-edit-global' => 'Apply this filter globally', |
| 208 | 212 | |
| 209 | 213 | // Filter editing helpers |
| 210 | 214 | 'abusefilter-edit-builder-select' => 'Select an option to add it at the cursor', |
| — | — | @@ -296,6 +300,7 @@ |
| 297 | 301 | 'abusefilter-history-foruser' => 'Changes by $1', |
| 298 | 302 | 'abusefilter-history-hidden' => 'Hidden', |
| 299 | 303 | 'abusefilter-history-enabled' => 'Enabled', |
| | 304 | + 'abusefilter-history-global' => 'Global', |
| 300 | 305 | 'abusefilter-history-timestamp' => 'Time', |
| 301 | 306 | 'abusefilter-history-user' => 'User', |
| 302 | 307 | 'abusefilter-history-public' => 'Public filter description', |
| — | — | @@ -460,10 +465,10 @@ |
| 461 | 466 | * $4 link to page the action that triggered the filter was made on |
| 462 | 467 | * $5 actions taken by the filter |
| 463 | 468 | * $6 comments in filter description', |
| 464 | | - 'abusefilter-log-detailedentry' => 'This message is for a log entry. |
| | 469 | + 'abusefilter-log-detailedentry-meta' => 'This message is for a log entry. |
| 465 | 470 | * $1 timestamp |
| 466 | 471 | * $2 user |
| 467 | | -* $3 filter name |
| | 472 | +* $3 link to filter |
| 468 | 473 | * $4 action by user |
| 469 | 474 | * $5 link to page the action that triggered the filter was made on |
| 470 | 475 | * $6 actions taken by the filter |
| — | — | @@ -1325,9 +1330,10 @@ |
| 1326 | 1331 | 'abusefilter-log-entry' => '$1: $2 выклікаў фільтар злоўжываньняў, выконваючы дзеяньне «$3» на $4. |
| 1327 | 1332 | Прынятыя меры: $5; |
| 1328 | 1333 | Апісаньне фільтру: $6', |
| 1329 | | - 'abusefilter-log-detailedentry' => '$1: $2 выклікаў [[Special:AbuseFilter/$3|фільтар $3]], выконваючы дзеяньне «$4» на $5. |
| | 1334 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 выклікаў $3, выконваючы дзеяньне «$4» на $5. |
| 1330 | 1335 | Прынятыя меры: $6; |
| 1331 | 1336 | Апісаньне фільтру: $7 ($8) ($9)', |
| | 1337 | + 'abusefilter-log-detailedentry-local' => 'фільтар $1', |
| 1332 | 1338 | 'abusefilter-log-detailslink' => 'падрабязнасьці', |
| 1333 | 1339 | 'abusefilter-log-details-legend' => 'Падрабязнасьці запісу ў журнале $1', |
| 1334 | 1340 | 'abusefilter-log-details-var' => 'Зьменная', |
| — | — | @@ -1669,7 +1675,8 @@ |
| 1670 | 1676 | 'abusefilter-log-search-title' => 'Заглавие:', |
| 1671 | 1677 | 'abusefilter-log-search-submit' => 'Търсене', |
| 1672 | 1678 | 'abusefilter-log-entry' => '$1: $2 задейства защитен филтър, извършвайки $3 на $4. Последвали действия: $5; Описание на филтъра: $6', |
| 1673 | | - 'abusefilter-log-detailedentry' => '$1: $2 задейства [[Special:AbuseFilter/$3|филтър $3]], извършвайки $4 на $5. Последвали действия: $6; Описание на филтъра: $7 ($8)', |
| | 1679 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 задейства $3, извършвайки $4 на $5. Последвали действия: $6; Описание на филтъра: $7 ($8)', |
| | 1680 | + 'abusefilter-log-detailedentry-local' => 'филтър $1', |
| 1674 | 1681 | 'abusefilter-log-detailslink' => 'детайли', |
| 1675 | 1682 | 'abusefilter-log-details-legend' => 'Детайли за запис от дневника $1', |
| 1676 | 1683 | 'abusefilter-log-details-var' => 'Променлива', |
| — | — | @@ -1876,7 +1883,8 @@ |
| 1877 | 1884 | 'abusefilter-log-entry' => '$1: Korisnik $2 je pokrenuo filter za zloupotrebu, napravivši akciju "$3" na $4. |
| 1878 | 1885 | Napravljena akcija: $5; |
| 1879 | 1886 | Opis filtera: $6', |
| 1880 | | - 'abusefilter-log-detailedentry' => '$1: Korisnik $2 pokrenuo [[Special:AbuseFilter/$3|filter $3]], napravivši akciju "$4" na $5. Napravljena akcija: $6; Opis filtera: $7 ($8) ($9)', |
| | 1887 | + 'abusefilter-log-detailedentry-meta' => '$1: Korisnik $2 pokrenuo $3, napravivši akciju "$4" na $5. Napravljena akcija: $6; Opis filtera: $7 ($8) ($9)', |
| | 1888 | + 'abusefilter-log-detailedentry-local' => 'filter $1', |
| 1881 | 1889 | 'abusefilter-log-detailslink' => 'detalji', |
| 1882 | 1890 | 'abusefilter-log-details-legend' => 'Detalji podataka u logu $1', |
| 1883 | 1891 | 'abusefilter-log-details-var' => 'Varijabla (promjenjiva)', |
| — | — | @@ -2256,8 +2264,9 @@ |
| 2257 | 2265 | 'abusefilter-log-search-submit' => 'Hledat', |
| 2258 | 2266 | 'abusefilter-log-entry' => '$1: $2 {{GENDER:$2|spustil|spustila|spustil}} filtr zneužívání při činnosti „$3“ na $4. |
| 2259 | 2267 | Provedená opatření: $5; popis filtru: $6', |
| 2260 | | - 'abusefilter-log-detailedentry' => '$1: $2 {{GENDER:$2|spustil|spustila|spustil}} [[Special:AbuseFilter/$3|filtr $3]] při činnosti „$4“ na $5. |
| | 2268 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 {{GENDER:$2|spustil|spustila|spustil}} $3 při činnosti „$4“ na $5. |
| 2261 | 2269 | Provedená opatření: $6; popis filtru: $7 ($8) ($9)', |
| | 2270 | + 'abusefilter-log-detailedentry-local' => 'filtr $1', |
| 2262 | 2271 | 'abusefilter-log-detailslink' => 'podrobnosti', |
| 2263 | 2272 | 'abusefilter-log-details-legend' => 'Podrobnosti záznamu $1', |
| 2264 | 2273 | 'abusefilter-log-details-var' => 'Proměnná', |
| — | — | @@ -2622,9 +2631,10 @@ |
| 2623 | 2632 | 'abusefilter-log-entry' => '$1: $2 löste einen Missbrauchsfilter aus, indem er die Aktion „$3“ auf „$4“ anwendete. |
| 2624 | 2633 | Filteraktion: „$5“; |
| 2625 | 2634 | Filterbeschreibung: „$6“', |
| 2626 | | - 'abusefilter-log-detailedentry' => '$1: $2 löste den [[Special:AbuseFilter/$3|Filter $3]] aus, indem er die Aktion „$4“ auf „$5“ anwendete. |
| | 2635 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 löste den $3 aus, indem er die Aktion „$4“ auf „$5“ anwendete. |
| 2627 | 2636 | Ergriffene Maßnahmen: $6; |
| 2628 | 2637 | Filterbeschreibung: $7 ($8) ($9)', |
| | 2638 | + 'abusefilter-log-detailedentry-local' => 'Filter $1', |
| 2629 | 2639 | 'abusefilter-log-detailslink' => 'Details', |
| 2630 | 2640 | 'abusefilter-log-details-legend' => 'Details für den Logbuch-Eintrag $1', |
| 2631 | 2641 | 'abusefilter-log-details-var' => 'Variable', |
| — | — | @@ -3015,7 +3025,8 @@ |
| 3016 | 3026 | 'abusefilter-log-search-title' => 'Titel:', |
| 3017 | 3027 | 'abusefilter-log-search-submit' => 'Pytaś', |
| 3018 | 3028 | 'abusefilter-log-entry' => '$1: $2 jo filter znjewužywanja zapušćił a cynił akciju $3 na $4. Wuwjeźone akcije: $5; Wopisanje filtra: $6', |
| 3019 | | - 'abusefilter-log-detailedentry' => '$1: $2 jo zapušćił [[Special:AbuseFilter/$3|filter $3]] a jo pśewjadł akciju "$4" na $5. Wuwjeźone akcije: $6; Wopisanje filtra: $7 ($8) ($9)', |
| | 3029 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 jo zapušćił $3 a jo pśewjadł akciju "$4" na $5. Wuwjeźone akcije: $6; Wopisanje filtra: $7 ($8) ($9)', |
| | 3030 | + 'abusefilter-log-detailedentry-local' => 'filter $1', |
| 3020 | 3031 | 'abusefilter-log-detailslink' => 'Drobnosći', |
| 3021 | 3032 | 'abusefilter-log-details-legend' => 'Drobnosći za protokolowy zapisk $1', |
| 3022 | 3033 | 'abusefilter-log-details-var' => 'Wariabla', |
| — | — | @@ -4303,9 +4314,10 @@ |
| 4304 | 4315 | 'abusefilter-log-entry' => '$1 : $2 a déclenché un filtre antiabus, lors de l’action « $3 » sur $4. |
| 4305 | 4316 | Actions prises : $5 ; |
| 4306 | 4317 | Description du filtre : $6', |
| 4307 | | - 'abusefilter-log-detailedentry' => '$1 : $2 a déclenché le [[Special:AbuseFilter/$3|filtre antiabus $3]], lors de l’action « $4 » sur $5. |
| | 4318 | + 'abusefilter-log-detailedentry-meta' => '$1 : $2 a déclenché le $3, lors de l’action « $4 » sur $5. |
| 4308 | 4319 | Actions prises : $6 ; |
| 4309 | 4320 | Description du filtre : $7 ($8) ($9)', |
| | 4321 | + 'abusefilter-log-detailedentry-local' => 'filtre antiabus $1', |
| 4310 | 4322 | 'abusefilter-log-detailslink' => 'détails', |
| 4311 | 4323 | 'abusefilter-log-details-legend' => 'Détails pour l’entrée $1 du journal', |
| 4312 | 4324 | 'abusefilter-log-details-var' => 'Variable', |
| — | — | @@ -4678,9 +4690,10 @@ |
| 4679 | 4691 | 'abusefilter-log-entry' => '$1: $2 accionou un filtro de abusos, levando a cabo a acción "$3" en $4. |
| 4680 | 4692 | Accións levadas a cabo: $5. |
| 4681 | 4693 | Descrición do filtro: $6', |
| 4682 | | - 'abusefilter-log-detailedentry' => '$1: $2 accionou [[Special:AbuseFilter/$3|o filtro $3]], levando a cabo a acción "$4" en $5. |
| | 4694 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 accionou $3, levando a cabo a acción "$4" en $5. |
| 4683 | 4695 | Accións levadas a cabo: $6. |
| 4684 | 4696 | Descrición do filtro: $7 ($8) ($9)', |
| | 4697 | + 'abusefilter-log-detailedentry-local' => 'o filtro $1', |
| 4685 | 4698 | 'abusefilter-log-detailslink' => 'detalles', |
| 4686 | 4699 | 'abusefilter-log-details-legend' => 'Detalles para a entrada $1 do rexistro', |
| 4687 | 4700 | 'abusefilter-log-details-var' => 'Variable', |
| — | — | @@ -5092,7 +5105,8 @@ |
| 5093 | 5106 | 'abusefilter-log-search-title' => 'Titel:', |
| 5094 | 5107 | 'abusefilter-log-search-submit' => 'Sueche', |
| 5095 | 5108 | 'abusefilter-log-entry' => '$1: $2 het e Missbrauchsfilter uusglest dur d Aawändig vu $3 uf $4. Aktion: $5; Filterbschryybig: $6', |
| 5096 | | - 'abusefilter-log-detailedentry' => '$1: $2 het dr [[Special:AbuseFilter/$3|Filter $3]] uusglest. Dees verursacht het e $4 uf $5. Ergriffeni Maßnahme: $6; Filterbschryybung: $7 ($8) ($9)', |
| | 5109 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 het dr $3 uusglest. Dees verursacht het e $4 uf $5. Ergriffeni Maßnahme: $6; Filterbschryybung: $7 ($8) ($9)', |
| | 5110 | + 'abusefilter-log-detailedentry-local' => 'Filter $1', |
| 5097 | 5111 | 'abusefilter-log-detailslink' => 'Detail', |
| 5098 | 5112 | 'abusefilter-log-details-legend' => 'Detail fir dr Logbuech-Yytrag $1', |
| 5099 | 5113 | 'abusefilter-log-details-var' => 'Variable', |
| — | — | @@ -5833,9 +5847,10 @@ |
| 5834 | 5848 | 'abusefilter-log-entry' => '$1: $2 pokrenuo je filtar zloporabe, vršeći radnju "$3" na $4. |
| 5835 | 5849 | Poduzete radnje: $5; |
| 5836 | 5850 | Opis filtra: $6', |
| 5837 | | - 'abusefilter-log-detailedentry' => '$1: $2 pokrenuo je [[Special:AbuseFilter/$3|filtar $3]], vršeći radnju "$4" na $5. |
| | 5851 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 pokrenuo je $3, vršeći radnju "$4" na $5. |
| 5838 | 5852 | Poduzete radnje: $6; |
| 5839 | 5853 | Opis filtra: $7 ($8) ($9)', |
| | 5854 | + 'abusefilter-log-detailedentry-local' => 'filtar $1', |
| 5840 | 5855 | 'abusefilter-log-detailslink' => 'detalji', |
| 5841 | 5856 | 'abusefilter-log-details-legend' => 'Detalji zapisa $1', |
| 5842 | 5857 | 'abusefilter-log-details-var' => 'Varijabla', |
| — | — | @@ -6106,9 +6121,10 @@ |
| 6107 | 6122 | 'abusefilter-log-entry' => '$1: $2 pušći znjewužiwanski filter přez wuwjedźenje akcije "$3" na $4. |
| 6108 | 6123 | Přewjedźene akcije: $5; |
| 6109 | 6124 | Wopisanje filtra: $6', |
| 6110 | | - 'abusefilter-log-detailedentry' => '$1: $2 pušći [[Special:AbuseFilter/$3|filter $3]] přez wuwjedźenje akcije "$4" na $5. |
| | 6125 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 pušći $3 přez wuwjedźenje akcije "$4" na $5. |
| 6111 | 6126 | Přewjedźene akcije: $6; |
| 6112 | 6127 | Wopisanje filtra:: $7 ($8) ($9)', |
| | 6128 | + 'abusefilter-log-detailedentry-local' => 'filter $1', |
| 6113 | 6129 | 'abusefilter-log-detailslink' => 'podrobnosće', |
| 6114 | 6130 | 'abusefilter-log-details-legend' => 'Podrobnosće za protokolowy zapisk $1', |
| 6115 | 6131 | 'abusefilter-log-details-var' => 'Wariabla', |
| — | — | @@ -6655,9 +6671,10 @@ |
| 6656 | 6672 | 'abusefilter-log-entry' => '$1: $2 activava un filtro anti-abuso, executante le action "$3" in $4. |
| 6657 | 6673 | Actiones interprendite: $5; |
| 6658 | 6674 | Description del filtro: $6', |
| 6659 | | - 'abusefilter-log-detailedentry' => '$1: $2 activava le [[Special:AbuseFilter/$3|filtro $3]], executante le action "$4" in $5. |
| | 6675 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 activava le $3, executante le action "$4" in $5. |
| 6660 | 6676 | Actiones interprendite: $6; |
| 6661 | 6677 | Description del filtro: $7 ($8) ($9)', |
| | 6678 | + 'abusefilter-log-detailedentry-local' => 'filtro $1', |
| 6662 | 6679 | 'abusefilter-log-detailslink' => 'detalios', |
| 6663 | 6680 | 'abusefilter-log-details-legend' => 'Detalios pro le entrata $1 del registro', |
| 6664 | 6681 | 'abusefilter-log-details-var' => 'Variabile', |
| — | — | @@ -7001,7 +7018,8 @@ |
| 7002 | 7019 | 'abusefilter-log-search-title' => 'Judul:', |
| 7003 | 7020 | 'abusefilter-log-search-submit' => 'Cari', |
| 7004 | 7021 | 'abusefilter-log-entry' => '$1: $2 memicu filter penyalahgunaan, melakukan $3 pada $4. Tindakan yang diambil: $5; Keterangan filter: $6', |
| 7005 | | - 'abusefilter-log-detailedentry' => '$1: $2 memicu filter penyalahgunaan $3, melakukan $4 pada $5. Tindakan yang diambil: $6; Keterangan filter: $7 ($8)', |
| | 7022 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 memicu filter penyalahgunaan $3, melakukan $4 pada $5. Tindakan yang diambil: $6; Keterangan filter: $7 ($8)', |
| | 7023 | + 'abusefilter-log-detailedentry-local' => 'filter $1', |
| 7006 | 7024 | 'abusefilter-log-detailslink' => 'rincian', |
| 7007 | 7025 | 'abusefilter-log-details-legend' => 'Rincian untuk entri log $1', |
| 7008 | 7026 | 'abusefilter-log-details-var' => 'Variable', |
| — | — | @@ -7214,9 +7232,10 @@ |
| 7215 | 7233 | 'abusefilter-log-entry' => '$1: $2 ha provocato l\'attivazione di un filtro anti abusi con l\'azione "$3" su $4. |
| 7216 | 7234 | Azioni intraprese: $5; |
| 7217 | 7235 | Descrizione del filtro: $6', |
| 7218 | | - 'abusefilter-log-detailedentry' => '$1: $2 ha provocato l\'attivazione [[Special:AbuseFilter/$3|del filtro $3]] con l\'azione "$4" su $5. |
| | 7236 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 ha provocato l\'attivazione $3 con l\'azione "$4" su $5. |
| 7219 | 7237 | Azioni intraprese: $6; |
| 7220 | 7238 | Descrizione del filtro: $7 ($8) ($9)', |
| | 7239 | + 'abusefilter-log-detailedentry-local' => 'del filtro $1', |
| 7221 | 7240 | 'abusefilter-log-detailslink' => 'dettagli', |
| 7222 | 7241 | 'abusefilter-log-details-legend' => 'Dettagli della voce di registro $1', |
| 7223 | 7242 | 'abusefilter-log-details-var' => 'Variabile', |
| — | — | @@ -7563,9 +7582,10 @@ |
| 7564 | 7583 | 'abusefilter-log-entry' => '$1: $2 が $4 で「$3」操作を行い不正利用フィルターに引っかかりました。 |
| 7565 | 7584 | 対処アクション: $5; |
| 7566 | 7585 | フィルター解説: $6', |
| 7567 | | - 'abusefilter-log-detailedentry' => '$1: $2 が $5 で「$4」操作を行い[[Special:AbuseFilter/$3|フィルター $3]] に引っかかりました。 |
| | 7586 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 が $5 で「$4」操作を行い$3 に引っかかりました。 |
| 7568 | 7587 | 対処アクション: $6; |
| 7569 | 7588 | フィルター解説: $7 ($8) ($9)', |
| | 7589 | + 'abusefilter-log-detailedentry-local' => 'フィルター $1', |
| 7570 | 7590 | 'abusefilter-log-detailslink' => '詳細', |
| 7571 | 7591 | 'abusefilter-log-details-legend' => '記録項目 $1 の詳細', |
| 7572 | 7592 | 'abusefilter-log-details-var' => '変数', |
| — | — | @@ -8228,9 +8248,10 @@ |
| 8229 | 8249 | 'abusefilter-log-search-submit' => 'Söhke!', |
| 8230 | 8250 | 'abusefilter-log-entry' => "$1: {{GENDER:$2|dä|et|dä Metmaacher|dat|de}} $2 hät met „$3“ op dä Sigg $4 |
| 8231 | 8251 | dä Meßbruchsfelter op der Plan jeroofe, un dä däät dat: $5. De Rääjel explezeet: ''$6''.", |
| 8232 | | - 'abusefilter-log-detailedentry' => '$1: {{GENDER:$2|dä|et|dä Metmaacher|dat|de}} $2 hät met „$4“ op dä Sigg $5 |
| 8233 | | -däm [[Special:AbuseFilter/$3|Meßbruchsfelter sing Rääjel $3]] jetroffe, |
| | 8252 | + 'abusefilter-log-detailedentry-meta' => '$1: {{GENDER:$2|dä|et|dä Metmaacher|dat|de}} $2 hät met „$4“ op dä Sigg $5 |
| | 8253 | +däm $3 jetroffe, |
| 8234 | 8254 | un dä Felter hät: $6. De Rääjel explezeet: $7 ($8) ($9)', |
| | 8255 | + 'abusefilter-log-detailedentry-local' => 'Meßbruchsfelter sing Rääjel $1', |
| 8235 | 8256 | 'abusefilter-log-detailslink' => 'Einzelheite aanloore', |
| 8236 | 8257 | 'abusefilter-log-details-legend' => 'Einzelheite för dä Logbooch-Endraach $1', |
| 8237 | 8258 | 'abusefilter-log-details-var' => 'Date (Speicher Name)', |
| — | — | @@ -8875,9 +8896,10 @@ |
| 8876 | 8897 | 'abusefilter-log-entry' => '$1: $2 leet \'ne misbroekfilter aafgaon bie \'t oetveure hanjeling "$3" op $4. |
| 8877 | 8898 | Genaome maatregel: $5. |
| 8878 | 8899 | Filterbesjrieving: $6', |
| 8879 | | - 'abusefilter-log-detailedentry' => '$1: $2 leet [[Special:AbuseFilter/$3|filter $3]] aafgaon bie \'t oetveure van de hanjeling "$4" op $5. |
| | 8900 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 leet $3 aafgaon bie \'t oetveure van de hanjeling "$4" op $5. |
| 8880 | 8901 | Genaome maatregel: $6. |
| 8881 | 8902 | Filterbesjrieving: $7 ($8) ($9)', |
| | 8903 | + 'abusefilter-log-detailedentry-local' => 'filter $1', |
| 8882 | 8904 | 'abusefilter-log-detailslink' => 'kleinighijjer', |
| 8883 | 8905 | 'abusefilter-log-details-legend' => 'Details veur logregel $1', |
| 8884 | 8906 | 'abusefilter-log-details-var' => 'Variabel', |
| — | — | @@ -9376,9 +9398,10 @@ |
| 9377 | 9399 | 'abusefilter-log-entry' => '$1: $2 hett en Missbruukfilter utlööst, as he de Akschoon „$3“ op „$4“ anwennt hett. |
| 9378 | 9400 | Filterakschoon: „$5“; |
| 9379 | 9401 | Wat dat för’n Filter is: „$6“', |
| 9380 | | - 'abusefilter-log-detailedentry' => '$1: $2 hett den [[Special:AbuseFilter/$3|Filter $3]] utlööst, as he de Akschoon „$4“ op „$5“ anwennt hett. |
| | 9402 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 hett den $3 utlööst, as he de Akschoon „$4“ op „$5“ anwennt hett. |
| 9381 | 9403 | Filterakschoon: $6; |
| 9382 | 9404 | Wat dat för’n Filter is: $7 ($8) ($9)', |
| | 9405 | + 'abusefilter-log-detailedentry-local' => 'Filter $1', |
| 9383 | 9406 | 'abusefilter-log-detailslink' => 'Details', |
| 9384 | 9407 | 'abusefilter-log-details-legend' => 'Details för Logbook-Indrag $1', |
| 9385 | 9408 | 'abusefilter-log-details-var' => 'Variable', |
| — | — | @@ -9745,9 +9768,10 @@ |
| 9746 | 9769 | 'abusefilter-log-entry' => '$1: $2 liet een misbruikfilter afgaan bij het uitvoeren handeling "$3" op $4. |
| 9747 | 9770 | Genomen maatregel: $5. |
| 9748 | 9771 | Filterbeschrijving: $6', |
| 9749 | | - 'abusefilter-log-detailedentry' => '$1: $2 liet [[Special:AbuseFilter/$3|filter $3]] afgaan bij het uitvoeren van de handeling "$4" op $5. |
| | 9772 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 liet $3 afgaan bij het uitvoeren van de handeling "$4" op $5. |
| 9750 | 9773 | Genomen maatregel: $6. |
| 9751 | 9774 | Filterbeschrijving: $7 ($8) ($9)', |
| | 9775 | + 'abusefilter-detailedentry-local' => 'filter $1', |
| 9752 | 9776 | 'abusefilter-log-detailslink' => 'details', |
| 9753 | 9777 | 'abusefilter-log-details-legend' => 'Details voor logboekregel $1', |
| 9754 | 9778 | 'abusefilter-log-details-var' => 'Variabele', |
| — | — | @@ -10098,7 +10122,8 @@ |
| 10099 | 10123 | 'abusefilter-log-search-title' => 'Tittel:', |
| 10100 | 10124 | 'abusefilter-log-search-submit' => 'Søk', |
| 10101 | 10125 | 'abusefilter-log-entry' => '$1: $2 utløyste eit misbruksfilter ved å gjera handlinga «$3» på $4. Reaksjon: $5; Filterskildring: $6', |
| 10102 | | - 'abusefilter-log-detailedentry' => '$1: $2 utløyste [[Special:AbuseFilter/$3|misbruksfilter $3]] ved å utføra handlinga «$4» på $5. Reaksjon: $6; Filterskildring: $7 ($8) ($9)', |
| | 10126 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 utløyste $3 ved å utføra handlinga «$4» på $5. Reaksjon: $6; Filterskildring: $7 ($8) ($9)', |
| | 10127 | + 'abusefilter-log-detailedentry-local' => 'misbruksfilter $1', |
| 10103 | 10128 | 'abusefilter-log-detailslink' => 'detaljar', |
| 10104 | 10129 | 'abusefilter-log-details-legend' => 'Detaljar for loggelementet $1', |
| 10105 | 10130 | 'abusefilter-log-details-var' => 'Variabel', |
| — | — | @@ -10439,9 +10464,10 @@ |
| 10440 | 10465 | 'abusefilter-log-entry' => '$1: $2 utløste misbruksfilteret ved å gjøre en $3 på $4. |
| 10441 | 10466 | Reaksjon: $5; |
| 10442 | 10467 | filterbeskrivelse: $6', |
| 10443 | | - 'abusefilter-log-detailedentry' => '$1: $2 utløste misbruksfilter [[Special:AbuseFilter/$3|filter $3]], ved å gjøre en $4 på $5. |
| | 10468 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 utløste misbruksfilter $3, ved å gjøre en $4 på $5. |
| 10444 | 10469 | Reaksjon: $6; |
| 10445 | 10470 | Filterbeskrivelse: $7 ($8) ($9)', |
| | 10471 | + 'abusefilter-log-detailedentry-local' => 'filter $1', |
| 10446 | 10472 | 'abusefilter-log-detailslink' => 'detaljer', |
| 10447 | 10473 | 'abusefilter-log-details-legend' => 'Detaljer for loggelement $1', |
| 10448 | 10474 | 'abusefilter-log-details-var' => 'Variabel', |
| — | — | @@ -10770,9 +10796,10 @@ |
| 10771 | 10797 | 'abusefilter-log-entry' => "$1 : $2 a desenclavat un filtre dels abuses, qu'executa l'accion « $3 » sus $4. |
| 10772 | 10798 | Accions presas : $5 ; |
| 10773 | 10799 | Descripcion del filtre : $6", |
| 10774 | | - 'abusefilter-log-detailedentry' => "$1 : $2 a desenclavat lo [[Special:AbuseFilter/$3|filtre $3 dels abuses]], en executant l'accion « $4 » sur $5. |
| | 10800 | + 'abusefilter-log-detailedentry-meta' => "$1 : $2 a desenclavat lo $3, en executant l'accion « $4 » sur $5. |
| 10775 | 10801 | Accions presas : $6 ; |
| 10776 | 10802 | Descripcion del filtre : $7 ($8) ($9)", |
| | 10803 | + 'abusefilter-log-detailedentry-local' => 'filtre $1 dels abuses', |
| 10777 | 10804 | 'abusefilter-log-detailslink' => 'detalhs', |
| 10778 | 10805 | 'abusefilter-log-details-legend' => "Detalhs per l'entrada $1 del jornal", |
| 10779 | 10806 | 'abusefilter-log-details-var' => 'Variabla', |
| — | — | @@ -11161,9 +11188,10 @@ |
| 11162 | 11189 | 'abusefilter-log-entry' => '$1: $2 uruchomił filtr nadużyć, wykonał „$3” na $4. |
| 11163 | 11190 | Podjęta akcja: $5. |
| 11164 | 11191 | Opis filtru: $6', |
| 11165 | | - 'abusefilter-log-detailedentry' => '$1: $2 uruchomił [[Special:AbuseFilter/$3|filtr $3]], wykonał „$4” na $5. |
| | 11192 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 uruchomił $3, wykonał „$4” na $5. |
| 11166 | 11193 | Podjęta akcja: $6. |
| 11167 | 11194 | Opis filtru: $7 ($8) ($9)', |
| | 11195 | + 'abusefilter-log-detailedentry-local' => 'filtr $1', |
| 11168 | 11196 | 'abusefilter-log-detailslink' => 'szczegóły', |
| 11169 | 11197 | 'abusefilter-log-details-legend' => 'Szczegóły wpisu w rejestrze $1', |
| 11170 | 11198 | 'abusefilter-log-details-var' => 'Zmienna', |
| — | — | @@ -11543,9 +11571,10 @@ |
| 11544 | 11572 | 'abusefilter-log-entry' => '$1: $2 despoletou um filtro de abuso, executando a ação "$3" em $4. |
| 11545 | 11573 | Ações tomadas: $5; |
| 11546 | 11574 | Descrição do filtro: $6', |
| 11547 | | - 'abusefilter-log-detailedentry' => '$1: $2 despoletou o [[Special:AbuseFilter/$3|filtro $3]], executando a ação "$4" em $5. |
| | 11575 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 despoletou o $3, executando a ação "$4" em $5. |
| 11548 | 11576 | Ações tomadas: $6; |
| 11549 | 11577 | Descrição do filtro: $7 ($8) ($9)', |
| | 11578 | + 'abusefilter-log-detailedentry-local' => 'filtro $1', |
| 11550 | 11579 | 'abusefilter-log-detailslink' => 'detalhes', |
| 11551 | 11580 | 'abusefilter-log-details-legend' => 'Detalhes para entrada de registo $1', |
| 11552 | 11581 | 'abusefilter-log-details-var' => 'Variável', |
| — | — | @@ -11898,7 +11927,8 @@ |
| 11899 | 11928 | 'abusefilter-log-search-title' => 'Titlu:', |
| 11900 | 11929 | 'abusefilter-log-search-submit' => 'Caută', |
| 11901 | 11930 | 'abusefilter-log-entry' => '$1: $2 a declanşat un filtru abuz, executând $3 asupra $4. Măsura luată: $5; Descrierea filtrului: $6', |
| 11902 | | - 'abusefilter-log-detailedentry' => '$1: $2 a declanşat [[Special:AbuseFilter/$3|filtrul $3]], executând $4 asupra $5. Măsura luată: $6; Descrierea filtrului: $7 ($8)', |
| | 11931 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 a declanşat $3, executând $4 asupra $5. Măsura luată: $6; Descrierea filtrului: $7 ($8)', |
| | 11932 | + 'abusefilter-log-detailedentry-local' => 'filtrul $1', |
| 11903 | 11933 | 'abusefilter-log-detailslink' => 'detalii', |
| 11904 | 11934 | 'abusefilter-log-details-legend' => 'Detalii pentru intrarea $1 din jurnal', |
| 11905 | 11935 | 'abusefilter-log-details-var' => 'Variabilă', |
| — | — | @@ -12149,9 +12179,10 @@ |
| 12150 | 12180 | 'abusefilter-log-entry' => '$1: $2 вызвал срабатывание фильтра злоупотреблений, действие «$3» на странице $4. |
| 12151 | 12181 | Предпринятие меры: $5. |
| 12152 | 12182 | Описание фильтра: $6', |
| 12153 | | - 'abusefilter-log-detailedentry' => '$1: $2 вызвал срабатывание [[Special:AbuseFilter/$3|фильтра $3]], действие «$4» на странице $5. |
| | 12183 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 вызвал срабатывание $3, действие «$4» на странице $5. |
| 12154 | 12184 | Предпринятые меры: $6. |
| 12155 | 12185 | Описание фильтра: $7 ($8) ($9)', |
| | 12186 | + 'abusefilter-log-detailedentry-local' => 'фильтра $1', |
| 12156 | 12187 | 'abusefilter-log-detailslink' => 'подробности', |
| 12157 | 12188 | 'abusefilter-log-details-legend' => 'Подробности записи журнала $1', |
| 12158 | 12189 | 'abusefilter-log-details-var' => 'Переменная', |
| — | — | @@ -12506,9 +12537,10 @@ |
| 12507 | 12538 | 'abusefilter-log-entry' => '$1: киниттэн сылтаан - $2 - омсо сиидэтэ үлэлээбит, «$3» дьайыыны $4 сирэйгэ оҥорбут. |
| 12508 | 12539 | Оҥоһуллубут дьайыылар: $5. |
| 12509 | 12540 | Сиидэ туһунан: $6', |
| 12510 | | - 'abusefilter-log-detailedentry' => '$1: $2 кыттааччыттан сылтаан [[Special:AbuseFilter/$3|$3 сиидэ]] үлэлээбит, «$4» дьайыыны $5 сирэйгэ оҥорбут. |
| | 12541 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 кыттааччыттан сылтаан $3 үлэлээбит, «$4» дьайыыны $5 сирэйгэ оҥорбут. |
| 12511 | 12542 | Оҥоһуллубут дьайыылар: $6. |
| 12512 | 12543 | Сиидэ туһунан: $7 ($8) ($9)', |
| | 12544 | + 'abusefilter-log-detailedentry-local' => '$1 сиидэ', |
| 12513 | 12545 | 'abusefilter-log-detailslink' => 'сиһилии', |
| 12514 | 12546 | 'abusefilter-log-details-legend' => '$1 сурунаал суруга сиһилии', |
| 12515 | 12547 | 'abusefilter-log-details-var' => 'Уларыйар кэриҥ (переменная)', |
| — | — | @@ -12830,9 +12862,10 @@ |
| 12831 | 12863 | 'abusefilter-log-entry' => '$1: $2 spustil filter zneužití, pri vykonávaní „$3“ na $4. |
| 12832 | 12864 | Vykonané opatrenia: $5; |
| 12833 | 12865 | Popis filtra: $6', |
| 12834 | | - 'abusefilter-log-detailedentry' => '$1: $2 spustil filter [[Special:AbuseFilter/$3|filter $3]], vynkonaná operácia „$4“ na $5. |
| | 12866 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 spustil filter $3, vynkonaná operácia „$4“ na $5. |
| 12835 | 12867 | Vykonané opatrenia: $6; |
| 12836 | 12868 | Popis filtra: $7 ($8) ($9)', |
| | 12869 | + 'abusefilter-log-detailedentry-local' => 'filter $1', |
| 12837 | 12870 | 'abusefilter-log-detailslink' => 'podrobnosti', |
| 12838 | 12871 | 'abusefilter-log-details-legend' => 'Podrobnosti položky záznamu $1', |
| 12839 | 12872 | 'abusefilter-log-details-var' => 'Premenná', |
| — | — | @@ -13190,7 +13223,8 @@ |
| 13191 | 13224 | 'abusefilter-log-search-title' => 'Tittel:', |
| 13192 | 13225 | 'abusefilter-log-search-submit' => 'Säike (uk ap Düütsk5)', |
| 13193 | 13226 | 'abusefilter-log-entry' => '$1: $2 löösde ne Misbruuks-Sieuwe uut, truch dät hie $3 ap $4 moakede. Aktion: $5; Sieuwe-Beschrieuwenge: $6', |
| 13194 | | - 'abusefilter-log-detailedentry' => '$1: $2 häd ju [[Special:AbuseFilter/$3|Sieuwe $3]] uutlöösd, wät n $4 ap $5 feruurseeked. Ärgriepene Mäitenoamen: $6; Sieuwebeschrieuwenge: $7 ($8)', |
| | 13227 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 häd ju $3 uutlöösd, wät n $4 ap $5 feruurseeked. Ärgriepene Mäitenoamen: $6; Sieuwebeschrieuwenge: $7 ($8)', |
| | 13228 | + 'abusefilter-log-detailedentry-local' => 'Sieuwe $1', |
| 13195 | 13229 | 'abusefilter-log-detailslink' => 'Eenpeldhaide', |
| 13196 | 13230 | 'abusefilter-log-details-legend' => 'Eenpeldhaide foar dän Logbouk-Iendraach $1', |
| 13197 | 13231 | 'abusefilter-log-details-var' => 'Variable', |
| — | — | @@ -13420,9 +13454,10 @@ |
| 13421 | 13455 | 'abusefilter-log-entry' => '$1: $2 utlöste ett missbruksfilter genom att göra handlingen "$3" på $4. |
| 13422 | 13456 | Utförd handling: $5; |
| 13423 | 13457 | Filterbeskrivning: $6', |
| 13424 | | - 'abusefilter-log-detailedentry' => '$1: $2 utlöste [[Special:AbuseFilter/$3|filter $3]], genom att göra handlingen "$4" på $5. |
| | 13458 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 utlöste $3, genom att göra handlingen "$4" på $5. |
| 13425 | 13459 | Utförd handling: $6; |
| 13426 | 13460 | Filterbeskrivning: $7 ($8) ($9)', |
| | 13461 | + 'abusefilter-log-detailedentry-local' => 'filter $1', |
| 13427 | 13462 | 'abusefilter-log-detailslink' => 'detaljer', |
| 13428 | 13463 | 'abusefilter-log-details-legend' => 'Detaljer för loggelement $1', |
| 13429 | 13464 | 'abusefilter-log-details-var' => 'Variabel', |
| — | — | @@ -13869,7 +13904,8 @@ |
| 13870 | 13905 | 'abusefilter-log-entry' => '$1: nagpagalaw si $2 ng isang pansala ng pang-aabuso, na nagsagawa ng $3 sa $4. |
| 13871 | 13906 | Mga kilos na ginawa: $5; |
| 13872 | 13907 | Paglalarawan ng pansala: $6', |
| 13873 | | - 'abusefilter-log-detailedentry' => '$1: nagpagalaw si $2 ng [[Special:AbuseFilter/$3|pansalang $3]], na nagsagawa ng kilos na $4 sa $5. Mga kilos na ginawa: $6; Paglalarawan ng pansala: $7 ($8) ($9)', |
| | 13908 | + 'abusefilter-log-detailedentry-meta' => '$1: nagpagalaw si $2 ng $3, na nagsagawa ng kilos na $4 sa $5. Mga kilos na ginawa: $6; Paglalarawan ng pansala: $7 ($8) ($9)', |
| | 13909 | + 'abusefilter-log-detailedentry-local' => 'pansalang $1', |
| 13874 | 13910 | 'abusefilter-log-detailslink' => 'mga detalye', |
| 13875 | 13911 | 'abusefilter-log-details-legend' => 'Mga detalye para sa ipinasok sa talang $1', |
| 13876 | 13912 | 'abusefilter-log-details-var' => 'Pabagu-bago', |
| — | — | @@ -14224,9 +14260,10 @@ |
| 14225 | 14261 | 'abusefilter-log-entry' => '$1: $2 bir suistimal filtresini tetikledi, $4 sayfasında "$3" eylemi yapılıyor. |
| 14226 | 14262 | Yapılan eylemler: $5; |
| 14227 | 14263 | Filtre açıklaması: $6', |
| 14228 | | - 'abusefilter-log-detailedentry' => '$1: $2, [[Special:AbuseFilter/$3|$3 süzgecini]] tetikledi, $5 sayfasında "$4" eylemi yapılıyor. |
| | 14264 | + 'abusefilter-log-detailedentry-meta' => '$1: $2, $3 tetikledi, $5 sayfasında "$4" eylemi yapılıyor. |
| 14229 | 14265 | Yapılan eylemler: $6; |
| 14230 | 14266 | Süzgeç açıklaması: $7 ($8) ($9)', |
| | 14267 | + 'abusefilter-log-detailedentry-local' => '$1 süzgecini', |
| 14231 | 14268 | 'abusefilter-log-detailslink' => 'ayrıntılar', |
| 14232 | 14269 | 'abusefilter-log-details-legend' => '$1 günlük girdisi için ayrıntılar', |
| 14233 | 14270 | 'abusefilter-log-details-var' => 'Değişken', |
| — | — | @@ -14571,9 +14608,10 @@ |
| 14572 | 14609 | 'abusefilter-log-search-title' => 'Заголовок:', |
| 14573 | 14610 | 'abusefilter-log-search-submit' => 'Знайти', |
| 14574 | 14611 | 'abusefilter-log-entry' => '$1: $2 запустив фільтр зловживань, виконуючи "$3" на сторінці "$4". Прийняті заходи: $5; опис фільтру: $6', |
| 14575 | | - 'abusefilter-log-detailedentry' => '$1: $2 запустив [[Special:AbuseFilter/$3|фільтр $3]], виконуючи "$4" на сторінці "$5". |
| | 14612 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 запустив $3, виконуючи "$4" на сторінці "$5". |
| 14576 | 14613 | Вжиті заходи: $6. |
| 14577 | 14614 | Опис фільтру: $7 ($8) ($9)', |
| | 14615 | + 'abusefilter-log-detailedentry-local' => 'фільтр $1', |
| 14578 | 14616 | 'abusefilter-log-detailslink' => 'деталі', |
| 14579 | 14617 | 'abusefilter-log-details-legend' => 'Деталі журнального запису $1', |
| 14580 | 14618 | 'abusefilter-log-details-var' => 'Змінна', |
| — | — | @@ -14897,9 +14935,10 @@ |
| 14898 | 14936 | 'abusefilter-log-search-title' => 'Tựa đề:', |
| 14899 | 14937 | 'abusefilter-log-search-submit' => 'Tìm kiếm', |
| 14900 | 14938 | 'abusefilter-log-entry' => '$1: $2 đã kích hoạt bộ lọc sai phạm, thực hiện tác động “$3” vào lúc $4. Tác vụ diễn ra: $5; Mô tả bộ lọc: $6', |
| 14901 | | - 'abusefilter-log-detailedentry' => '$1: $2 đã kích hoạt [[Special:AbuseFilter/$3|bộ lọc $3]], thực hiện tác vụ “$4” trên $5. |
| | 14939 | + 'abusefilter-log-detailedentry-meta' => '$1: $2 đã kích hoạt $3, thực hiện tác vụ “$4” trên $5. |
| 14902 | 14940 | Tác vụ thực hiện: $6; |
| 14903 | 14941 | Mô tả bộ lọc: $7 ($8) ($9)', |
| | 14942 | + 'abusefilter-log-detailedentry-local' => 'bộ lọc $1', |
| 14904 | 14943 | 'abusefilter-log-detailslink' => 'chi tiết', |
| 14905 | 14944 | 'abusefilter-log-details-legend' => 'Chi tiết cho mục nhật trình $1', |
| 14906 | 14945 | 'abusefilter-log-details-var' => 'Biến', |
| Index: trunk/extensions/AbuseFilter/abusefilter.tables.sql |
| — | — | @@ -14,6 +14,7 @@ |
| 15 | 15 | af_throttled tinyint(1) NOT NULL default 0, |
| 16 | 16 | af_deleted tinyint(1) NOT NULL DEFAULT 0, |
| 17 | 17 | af_actions varchar(255) NOT NULL DEFAULT '', |
| | 18 | + af_global tinyint(1) NOT NULL DEFAULT 0, |
| 18 | 19 | |
| 19 | 20 | PRIMARY KEY (af_id), |
| 20 | 21 | KEY (af_user) |
| — | — | @@ -30,7 +31,7 @@ |
| 31 | 32 | |
| 32 | 33 | CREATE TABLE /*$wgDBprefix*/abuse_filter_log ( |
| 33 | 34 | afl_id BIGINT unsigned NOT NULL AUTO_INCREMENT, |
| 34 | | - afl_filter BIGINT unsigned NOT NULL, |
| | 35 | + afl_filter varchar(64) binary NOT NULL, |
| 35 | 36 | afl_user BIGINT unsigned NOT NULL, |
| 36 | 37 | afl_user_text varchar(255) binary NOT NULL, |
| 37 | 38 | afl_ip varchar(255) not null, |
| — | — | @@ -40,6 +41,8 @@ |
| 41 | 42 | afl_timestamp binary(14) NOT NULL, |
| 42 | 43 | afl_namespace tinyint NOT NULL, |
| 43 | 44 | afl_title varchar(255) binary NOT NULL, |
| | 45 | + afl_wiki varchar(64) binary NULL, |
| | 46 | + afl_deleted tinyint(1) NULL, |
| 44 | 47 | |
| 45 | 48 | PRIMARY KEY (afl_id), |
| 46 | 49 | KEY (afl_filter), |