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), |