summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SpamBlacklist
diff options
context:
space:
mode:
authorYaco <franco@reevo.org>2020-06-04 11:01:00 -0300
committerYaco <franco@reevo.org>2020-06-04 11:01:00 -0300
commitfc7369835258467bf97eb64f184b93691f9a9fd5 (patch)
treedaabd60089d2dd76d9f5fb416b005fbe159c799d /www/wiki/extensions/SpamBlacklist
first commit
Diffstat (limited to 'www/wiki/extensions/SpamBlacklist')
-rw-r--r--www/wiki/extensions/SpamBlacklist/BaseBlacklist.php422
-rw-r--r--www/wiki/extensions/SpamBlacklist/CODE_OF_CONDUCT.md1
-rw-r--r--www/wiki/extensions/SpamBlacklist/COPYING339
-rw-r--r--www/wiki/extensions/SpamBlacklist/EmailBlacklist.php67
-rw-r--r--www/wiki/extensions/SpamBlacklist/Gruntfile.js34
-rw-r--r--www/wiki/extensions/SpamBlacklist/README165
-rw-r--r--www/wiki/extensions/SpamBlacklist/SpamBlacklist.php14
-rw-r--r--www/wiki/extensions/SpamBlacklist/SpamBlacklistHooks.php317
-rw-r--r--www/wiki/extensions/SpamBlacklist/SpamBlacklistLogFormatter.php11
-rw-r--r--www/wiki/extensions/SpamBlacklist/SpamBlacklistPreAuthenticationProvider.php15
-rw-r--r--www/wiki/extensions/SpamBlacklist/SpamBlacklist_body.php347
-rw-r--r--www/wiki/extensions/SpamBlacklist/SpamRegexBatch.php175
-rw-r--r--www/wiki/extensions/SpamBlacklist/api/ApiSpamBlacklist.php71
-rw-r--r--www/wiki/extensions/SpamBlacklist/cleanup.php126
-rw-r--r--www/wiki/extensions/SpamBlacklist/composer.json23
-rw-r--r--www/wiki/extensions/SpamBlacklist/extension.json95
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/ais.json21
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/an.json16
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/ar.json29
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/arz.json12
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/as.json18
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/ast.json26
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/ba.json24
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/bcc.json10
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/bcl.json16
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/be-tarask.json20
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/bg.json15
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/bjn.json8
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/bn.json23
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/bo.json7
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/br.json17
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/bs.json17
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/ca.json19
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/ce.json10
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/ckb.json8
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/cs.json23
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/cy.json22
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/da.json23
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/de-ch.json8
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/de-formal.json8
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/de.json32
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/diq.json21
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/dsb.json12
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/el.json13
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/en.json23
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/eo.json16
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/es.json34
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/et.json24
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/fa.json26
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/fi.json27
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/fr.json30
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/frp.json11
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/gl.json28
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/gsw.json16
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/gu.json18
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/he.json28
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/hi.json17
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/hr.json15
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/hsb.json16
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/hu.json28
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/ia.json21
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/id.json18
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/ilo.json24
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/is.json16
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/it.json23
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/ja.json31
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/jut.json8
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/jv.json15
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/ka.json19
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/kk-arab.json6
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/kk-cyrl.json17
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/kk-latn.json6
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/ko.json30
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/ksh.json24
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/lb.json11
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/li.json17
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/lki.json22
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/lrc.json12
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/lt.json25
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/min.json8
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/mk.json25
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/ml.json24
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/mr.json18
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/ms.json19
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/nap.json24
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/nb.json25
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/nds.json11
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/nl-informal.json8
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/nl.json22
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/nn.json11
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/oc.json11
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/or.json17
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/pl.json32
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/pms.json23
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/pnb.json11
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/pt-br.json31
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/pt.json31
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/qqq.json31
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/rm.json8
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/ro.json18
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/roa-tara.json25
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/ru.json33
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/rue.json16
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/sa.json17
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/sah.json12
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/scn.json13
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/sco.json8
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/si.json13
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/sk.json11
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/sl.json26
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/sq.json15
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/sr-ec.json17
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/sr-el.json16
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/stq.json11
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/sv.json30
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/ta.json11
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/te.json11
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/tg-cyrl.json11
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/tg-latn.json11
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/tk.json9
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/tl.json16
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/tr.json25
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/uk.json31
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/ur.json11
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/vec.json17
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/vi.json21
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/wuu.json8
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/yue.json7
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/zh-hans.json34
-rw-r--r--www/wiki/extensions/SpamBlacklist/i18n/zh-hant.json27
-rw-r--r--www/wiki/extensions/SpamBlacklist/includes/ApiSpamBlacklist.php72
-rw-r--r--www/wiki/extensions/SpamBlacklist/includes/BaseBlacklist.php448
-rw-r--r--www/wiki/extensions/SpamBlacklist/includes/EmailBlacklist.php67
-rw-r--r--www/wiki/extensions/SpamBlacklist/includes/SpamBlacklist.php348
-rw-r--r--www/wiki/extensions/SpamBlacklist/includes/SpamBlacklistHooks.php283
-rw-r--r--www/wiki/extensions/SpamBlacklist/includes/SpamBlacklistLogFormatter.php11
-rw-r--r--www/wiki/extensions/SpamBlacklist/includes/SpamBlacklistPreAuthenticationProvider.php14
-rw-r--r--www/wiki/extensions/SpamBlacklist/includes/SpamRegexBatch.php175
-rw-r--r--www/wiki/extensions/SpamBlacklist/maintenance/cleanup.php114
-rw-r--r--www/wiki/extensions/SpamBlacklist/phpcs.xml27
-rw-r--r--www/wiki/extensions/SpamBlacklist/tests/phan/config.php19
-rw-r--r--www/wiki/extensions/SpamBlacklist/tests/phpunit/BaseBlacklistTest.php51
-rw-r--r--www/wiki/extensions/SpamBlacklist/tests/phpunit/SpamBlacklistTest.php91
143 files changed, 6043 insertions, 0 deletions
diff --git a/www/wiki/extensions/SpamBlacklist/BaseBlacklist.php b/www/wiki/extensions/SpamBlacklist/BaseBlacklist.php
new file mode 100644
index 00000000..8f15aa91
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/BaseBlacklist.php
@@ -0,0 +1,422 @@
+<?php
+
+/**
+ * Base class for different kinds of blacklists
+ */
+abstract class BaseBlacklist {
+ /**
+ * Array of blacklist sources
+ *
+ * @var array
+ */
+ public $files = [];
+
+ /**
+ * Array containing regexes to test against
+ *
+ * @var bool|array
+ */
+ protected $regexes = false;
+
+ /**
+ * Chance of receiving a warning when the filter is hit
+ *
+ * @var int
+ */
+ public $warningChance = 100;
+
+ /**
+ * @var int
+ */
+ public $warningTime = 600;
+
+ /**
+ * @var int
+ */
+ public $expiryTime = 900;
+
+ /**
+ * Array containing blacklists that extend BaseBlacklist
+ *
+ * @var array
+ */
+ private static $blacklistTypes = [
+ 'spam' => 'SpamBlacklist',
+ 'email' => 'EmailBlacklist',
+ ];
+
+ /**
+ * Array of blacklist instances
+ *
+ * @var array
+ */
+ private static $instances = [];
+
+ /**
+ * Constructor
+ *
+ * @param array $settings
+ */
+ function __construct( $settings = [] ) {
+ foreach ( $settings as $name => $value ) {
+ $this->$name = $value;
+ }
+ }
+
+ /**
+ * @param array $links
+ * @param Title $title
+ * @param bool $preventLog
+ * @return mixed
+ */
+ abstract public function filter( array $links, Title $title, $preventLog = false );
+
+ /**
+ * Adds a blacklist class to the registry
+ *
+ * @param $type string
+ * @param $class string
+ */
+ public static function addBlacklistType( $type, $class ) {
+ self::$blacklistTypes[$type] = $class;
+ }
+
+ /**
+ * Return the array of blacklist types currently defined
+ *
+ * @return array
+ */
+ public static function getBlacklistTypes() {
+ return self::$blacklistTypes;
+ }
+
+ /**
+ * Returns an instance of the given blacklist
+ *
+ * @param $type string Code for the blacklist
+ * @return BaseBlacklist
+ * @throws Exception
+ */
+ public static function getInstance( $type ) {
+ if ( !isset( self::$blacklistTypes[$type] ) ) {
+ throw new Exception( "Invalid blacklist type '$type' passed to " . __METHOD__ );
+ }
+
+ if ( !isset( self::$instances[$type] ) ) {
+ global $wgBlacklistSettings;
+
+ // Prevent notices
+ if ( !isset( $wgBlacklistSettings[$type] ) ) {
+ $wgBlacklistSettings[$type] = [];
+ }
+
+ $class = self::$blacklistTypes[$type];
+ self::$instances[$type] = new $class( $wgBlacklistSettings[$type] );
+ }
+
+ return self::$instances[$type];
+ }
+
+ /**
+ * Returns the code for the blacklist implementation
+ *
+ * @return string
+ */
+ abstract protected function getBlacklistType();
+
+ /**
+ * Check if the given local page title is a spam regex source.
+ *
+ * @param Title $title
+ * @return bool
+ */
+ public static function isLocalSource( Title $title ) {
+ global $wgDBname, $wgBlacklistSettings;
+
+ if ( $title->getNamespace() == NS_MEDIAWIKI ) {
+ $sources = [];
+ foreach ( self::$blacklistTypes as $type => $class ) {
+ $type = ucfirst( $type );
+ $sources += [
+ "$type-blacklist",
+ "$type-whitelist"
+ ];
+ }
+
+ if ( in_array( $title->getDBkey(), $sources ) ) {
+ return true;
+ }
+ }
+
+ $thisHttp = wfExpandUrl( $title->getFullUrl( 'action=raw' ), PROTO_HTTP );
+ $thisHttpRegex = '/^' . preg_quote( $thisHttp, '/' ) . '(?:&.*)?$/';
+
+ $files = [];
+ foreach ( self::$blacklistTypes as $type => $class ) {
+ if ( isset( $wgBlacklistSettings[$type]['files'] ) ) {
+ $files += $wgBlacklistSettings[$type]['files'];
+ }
+ }
+
+ foreach ( $files as $fileName ) {
+ $matches = [];
+ if ( preg_match( '/^DB: (\w*) (.*)$/', $fileName, $matches ) ) {
+ if ( $wgDBname == $matches[1] ) {
+ if ( $matches[2] == $title->getPrefixedDbKey() ) {
+ // Local DB fetch of this page...
+ return true;
+ }
+ }
+ } elseif ( preg_match( $thisHttpRegex, $fileName ) ) {
+ // Raw view of this page
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns the type of blacklist from the given title
+ *
+ * @todo building a regex for this is pretty overkill
+ * @param Title $title
+ * @return bool|string
+ */
+ public static function getTypeFromTitle( Title $title ) {
+ global $wgContLang;
+
+ $types = array_map( [ $wgContLang, 'ucfirst' ], array_keys( self::$blacklistTypes ) );
+ $regex = '/(' . implode( '|', $types ). ')-(?:blacklist|whitelist)/';
+
+ if ( preg_match( $regex, $title->getDBkey(), $m ) ) {
+ return strtolower( $m[1] );
+ }
+
+ return false;
+ }
+
+ /**
+ * Fetch local and (possibly cached) remote blacklists.
+ * Will be cached locally across multiple invocations.
+ * @return array set of regular expressions, potentially empty.
+ */
+ function getBlacklists() {
+ if ( $this->regexes === false ) {
+ $this->regexes = array_merge(
+ $this->getLocalBlacklists(),
+ $this->getSharedBlacklists() );
+ }
+ return $this->regexes;
+ }
+
+ /**
+ * Returns the local blacklist
+ *
+ * @return array Regular expressions
+ */
+ public function getLocalBlacklists() {
+ $that = $this;
+ $type = $this->getBlacklistType();
+
+ return ObjectCache::getMainWANInstance()->getWithSetCallback(
+ wfMemcKey( 'spamblacklist', $type, 'blacklist-regex' ),
+ $this->expiryTime,
+ function () use ( $that, $type ) {
+ return SpamRegexBatch::regexesFromMessage( "{$type}-blacklist", $that );
+ }
+ );
+ }
+
+ /**
+ * Returns the (local) whitelist
+ *
+ * @return array Regular expressions
+ */
+ public function getWhitelists() {
+ $that = $this;
+ $type = $this->getBlacklistType();
+
+ return ObjectCache::getMainWANInstance()->getWithSetCallback(
+ wfMemcKey( 'spamblacklist', $type, 'whitelist-regex' ),
+ $this->expiryTime,
+ function () use ( $that, $type ) {
+ return SpamRegexBatch::regexesFromMessage( "{$type}-whitelist", $that );
+ }
+ );
+ }
+
+ /**
+ * Fetch (possibly cached) remote blacklists.
+ * @return array
+ */
+ function getSharedBlacklists() {
+ $listType = $this->getBlacklistType();
+
+ wfDebugLog( 'SpamBlacklist', "Loading $listType regex..." );
+
+ if ( count( $this->files ) == 0 ) {
+ # No lists
+ wfDebugLog( 'SpamBlacklist', "no files specified\n" );
+ return [];
+ }
+
+ $miss = false;
+
+ $that = $this;
+ $regexes = ObjectCache::getMainWANInstance()->getWithSetCallback(
+ // This used to be cached per-site, but that could be bad on a shared
+ // server where not all wikis have the same configuration.
+ wfMemcKey( 'spamblacklist', $listType, 'shared-blacklist-regex' ),
+ $this->expiryTime,
+ function () use ( $that, &$miss ) {
+ $miss = true;
+ return $that->buildSharedBlacklists();
+ }
+ );
+
+ if ( !$miss ) {
+ wfDebugLog( 'SpamBlacklist', "Got shared spam regexes from cache\n" );
+ }
+
+ return $regexes;
+ }
+
+ /**
+ * Clear all primary blacklist cache keys
+ *
+ * @note: this method is unused atm
+ */
+ function clearCache() {
+ $listType = $this->getBlacklistType();
+
+ $cache = ObjectCache::getMainWANInstance();
+ $cache->delete( wfMemcKey( 'spamblacklist', $listType, 'shared-blacklist-regex' ) );
+ $cache->delete( wfMemcKey( 'spamblacklist', $listType, 'blacklist-regex' ) );
+ $cache->delete( wfMemcKey( 'spamblacklist', $listType, 'whitelist-regex' ) );
+
+ wfDebugLog( 'SpamBlacklist', "$listType blacklist local cache cleared.\n" );
+ }
+
+ function buildSharedBlacklists() {
+ $regexes = [];
+ $listType = $this->getBlacklistType();
+ # Load lists
+ wfDebugLog( 'SpamBlacklist', "Constructing $listType blacklist\n" );
+ foreach ( $this->files as $fileName ) {
+ $matches = [];
+ if ( preg_match( '/^DB: ([\w-]*) (.*)$/', $fileName, $matches ) ) {
+ $text = $this->getArticleText( $matches[1], $matches[2] );
+ } elseif ( preg_match( '/^(https?:)?\/\//', $fileName ) ) {
+ $text = $this->getHttpText( $fileName );
+ } else {
+ $text = file_get_contents( $fileName );
+ wfDebugLog( 'SpamBlacklist', "got from file $fileName\n" );
+ }
+
+ // Build a separate batch of regexes from each source.
+ // While in theory we could squeeze a little efficiency
+ // out of combining multiple sources in one regex, if
+ // there's a bad line in one of them we'll gain more
+ // from only having to break that set into smaller pieces.
+ $regexes = array_merge( $regexes,
+ SpamRegexBatch::regexesFromText( $text, $this, $fileName ) );
+ }
+
+ return $regexes;
+ }
+
+ function getHttpText( $fileName ) {
+ global $wgDBname, $messageMemc;
+ $listType = $this->getBlacklistType();
+
+ # HTTP request
+ # To keep requests to a minimum, we save results into $messageMemc, which is
+ # similar to $wgMemc except almost certain to exist. By default, it is stored
+ # in the database
+ # There are two keys, when the warning key expires, a random thread will refresh
+ # the real key. This reduces the chance of multiple requests under high traffic
+ # conditions.
+ $key = "{$listType}_blacklist_file:$fileName";
+ $warningKey = "$wgDBname:{$listType}filewarning:$fileName";
+ $httpText = $messageMemc->get( $key );
+ $warning = $messageMemc->get( $warningKey );
+
+ if ( !is_string( $httpText ) || ( !$warning && !mt_rand( 0, $this->warningChance ) ) ) {
+ wfDebugLog( 'SpamBlacklist', "Loading $listType blacklist from $fileName\n" );
+ $httpText = Http::get( $fileName );
+ if ( $httpText === false ) {
+ wfDebugLog( 'SpamBlacklist', "Error loading $listType blacklist from $fileName\n" );
+ }
+ $messageMemc->set( $warningKey, 1, $this->warningTime );
+ $messageMemc->set( $key, $httpText, $this->expiryTime );
+ } else {
+ wfDebugLog( 'SpamBlacklist', "Got $listType blacklist from HTTP cache for $fileName\n" );
+ }
+ return $httpText;
+ }
+
+ /**
+ * Fetch an article from this or another local MediaWiki database.
+ * This is probably *very* fragile, and shouldn't be used perhaps.
+ *
+ * @param string $wiki
+ * @param string $article
+ * @return string
+ */
+ function getArticleText( $wiki, $article ) {
+ wfDebugLog( 'SpamBlacklist',
+ "Fetching {$this->getBlacklistType()} blacklist from '$article' on '$wiki'...\n" );
+
+ $title = Title::newFromText( $article );
+ // Load all the relevant tables from the correct DB.
+ // This assumes that old_text is the actual text or
+ // that the external store system is at least unified.
+ $row = wfGetDB( DB_SLAVE, [], $wiki )->selectRow(
+ [ 'page', 'revision', 'text' ],
+ array_merge(
+ Revision::selectFields(),
+ Revision::selectPageFields(),
+ Revision::selectTextFields()
+ ),
+ [
+ 'page_namespace' => $title->getNamespace(), // assume NS IDs match
+ 'page_title' => $title->getDBkey(), // assume same case rules
+ 'rev_id=page_latest',
+ 'old_id=rev_text_id'
+ ],
+ __METHOD__
+ );
+
+ return $row
+ ? ContentHandler::getContentText( Revision::newFromRow( $row )->getContent() )
+ : false;
+ }
+
+ /**
+ * Returns the start of the regex for matches
+ *
+ * @return string
+ */
+ public function getRegexStart() {
+ return '/[a-z0-9_\-.]*';
+ }
+
+ /**
+ * Returns the end of the regex for matches
+ *
+ * @param $batchSize
+ * @return string
+ */
+ public function getRegexEnd( $batchSize ) {
+ return ( $batchSize > 0 ) ? '/Sim' : '/im';
+ }
+
+ /**
+ * @param Title $title
+ * @param string[] $entries
+ */
+ public function warmCachesForFilter( Title $title, array $entries ) {
+ // subclass this
+ }
+}
diff --git a/www/wiki/extensions/SpamBlacklist/CODE_OF_CONDUCT.md b/www/wiki/extensions/SpamBlacklist/CODE_OF_CONDUCT.md
new file mode 100644
index 00000000..d8e5d087
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/CODE_OF_CONDUCT.md
@@ -0,0 +1 @@
+The development of this software is covered by a [Code of Conduct](https://www.mediawiki.org/wiki/Code_of_Conduct).
diff --git a/www/wiki/extensions/SpamBlacklist/COPYING b/www/wiki/extensions/SpamBlacklist/COPYING
new file mode 100644
index 00000000..d159169d
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/www/wiki/extensions/SpamBlacklist/EmailBlacklist.php b/www/wiki/extensions/SpamBlacklist/EmailBlacklist.php
new file mode 100644
index 00000000..afcc8eb2
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/EmailBlacklist.php
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * Email Blacklisting
+ */
+class EmailBlacklist extends BaseBlacklist {
+ /**
+ * @param array $links
+ * @param Title $title
+ * @param bool $preventLog
+ * @return mixed
+ */
+ public function filter( array $links, Title $title, $preventLog = false ) {
+ throw new LogicException( __CLASS__ . ' cannot be used to filter links.' );
+ }
+
+ /**
+ * Returns the code for the blacklist implementation
+ *
+ * @return string
+ */
+ protected function getBlacklistType() {
+ return 'email';
+ }
+
+ /**
+ * Checks a User object for a blacklisted email address
+ *
+ * @param User $user
+ * @return bool True on valid email
+ */
+ public function checkUser( User $user ) {
+ $blacklists = $this->getBlacklists();
+ $whitelists = $this->getWhitelists();
+
+ // The email to check
+ $email = $user->getEmail();
+
+ if ( !count( $blacklists ) ) {
+ // Nothing to check
+ return true;
+ }
+
+ // Check for whitelisted email addresses
+ if ( is_array( $whitelists ) ) {
+ wfDebugLog( 'SpamBlacklist', "Excluding whitelisted email addresses from " .
+ count( $whitelists ) . " regexes: " . implode( ', ', $whitelists ) . "\n" );
+ foreach ( $whitelists as $regex ) {
+ if ( preg_match( $regex, $email ) ) {
+ // Whitelisted email
+ return true;
+ }
+ }
+ }
+
+ # Do the match
+ wfDebugLog( 'SpamBlacklist', "Checking e-mail address against " . count( $blacklists ) .
+ " regexes: " . implode( ', ', $blacklists ) . "\n" );
+ foreach ( $blacklists as $regex ) {
+ if ( preg_match( $regex, $email ) ) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/www/wiki/extensions/SpamBlacklist/Gruntfile.js b/www/wiki/extensions/SpamBlacklist/Gruntfile.js
new file mode 100644
index 00000000..3a2f7450
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/Gruntfile.js
@@ -0,0 +1,34 @@
+/*!
+ * Grunt file
+ *
+ * @package SpamBlacklist
+ */
+
+/*jshint node:true */
+module.exports = function ( grunt ) {
+ grunt.loadNpmTasks( 'grunt-banana-checker' );
+ grunt.loadNpmTasks( 'grunt-jsonlint' );
+ grunt.loadNpmTasks( 'grunt-contrib-jshint' );
+
+ var conf = grunt.file.readJSON( 'extension.json' );
+ grunt.initConfig( {
+ banana: conf.MessagesDirs,
+ jshint: {
+ all: [
+ '**/*.js',
+ '!node_modules/**',
+ '!vendor/**'
+ ]
+ },
+ jsonlint: {
+ all: [
+ '**/*.json',
+ '!node_modules/**',
+ '!vendor/**'
+ ]
+ }
+ } );
+
+ grunt.registerTask( 'test', [ 'jsonlint', 'banana', 'jshint' ] );
+ grunt.registerTask( 'default', 'test' );
+};
diff --git a/www/wiki/extensions/SpamBlacklist/README b/www/wiki/extensions/SpamBlacklist/README
new file mode 100644
index 00000000..5ebbd600
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/README
@@ -0,0 +1,165 @@
+MediaWiki extension: SpamBlacklist
+----------------------------------
+
+SpamBlacklist is a simple edit filter extension. When someone tries to save the
+page, it checks the text against a potentially very large list of "bad"
+hostnames. If there is a match, it displays an error message to the user and
+refuses to save the page.
+
+To enable it, first download a copy of the SpamBlacklist directory and put it
+into your extensions directory. Then put the following at the end of your
+LocalSettings.php:
+
+require_once( "$IP/extensions/SpamBlacklist/SpamBlacklist.php" );
+
+The list of bad URLs can be drawn from multiple sources. These sources are
+configured with the $wgSpamBlacklistFiles global variable. This global variable
+can be set in LocalSettings.php, AFTER including SpamBlacklist.php.
+
+$wgSpamBlacklistFiles is an array, each value containing either a URL, a filename
+or a database location. Specifying a database location allows you to draw the
+blacklist from a page on your wiki. The format of the database location
+specifier is "DB: <db name> <title>".
+
+Example:
+
+require_once( "$IP/extensions/SpamBlacklist/SpamBlacklist.php" );
+$wgSpamBlacklistFiles = array(
+ "$IP/extensions/SpamBlacklist/wikimedia_blacklist", // Wikimedia's list
+
+// database title
+ "DB: wikidb My_spam_blacklist",
+);
+
+The local pages [[MediaWiki:Spam-blacklist]] and [[MediaWiki:Spam-whitelist]]
+will always be used, whatever additional files are listed.
+
+Compatibility
+-----------
+
+This extension is primarily maintained to run on the latest release version
+of MediaWiki (1.22.x as of this writing) and development versions, however
+the current version should work up to 1.21.
+
+If you are using an older version of MediaWiki, you can checkout an
+older release branch, for example MediaWiki 1.20 would use REL1_20.
+
+For even older versions, you may be able to dig older versions out of the
+Git repository which work, but if using Wikimedia's blacklist file
+you will likely have problems with failure due to the large size of the
+blacklist not being handled by old versions of the code.
+
+
+File format
+-----------
+
+In simple terms:
+ * Everything from a "#" character to the end of the line is a comment
+ * Every non-blank line is a regex fragment which will only match inside URLs
+
+Internally, a regex is formed which looks like this:
+
+ !http://[a-z0-9\-.]*(line 1|line 2|line 3|....)!Si
+
+A few notes about this format. It's not necessary to add www to the start of
+hostnames, the regex is designed to match any subdomain. Don't add patterns
+to your file which may run off the end of the URL, e.g. anything containing
+".*". Unlike in some similar systems, the line-end metacharacter "$" will not
+assert the end of the hostname, it'll assert the end of the page.
+
+Performance
+-----------
+
+This extension uses a small "loader" file, to avoid loading all the code on
+every page view. This means that page view performance will not be affected
+even if you are not running a PHP bytecode cache such as Turck MMCache. Note
+that a bytecode cache is strongly recommended for any MediaWiki installation.
+
+The regex match itself generally adds an insignificant overhead to page saves,
+on the order of 100ms in our experience. However loading the spam file from disk
+or the database, and constructing the regex, may take a significant amount of
+time depending on your hardware. If you find that enabling this extension slows
+down saves excessively, try installing MemCached or another supported data
+caching solution. The SpamBlacklist extension will cache the constructed regex
+if such a system is present.
+
+Caching behavior
+----------------
+
+Blacklist files loaded from remote web sites are cached locally, in the cache
+subsystem used for MediaWiki's localization. (This usually means the objectcache
+table on a default install.)
+
+By default, the list is cached for 15 minutes (if successfully fetched) or
+10 minutes (if the network fetch failed), after which point it will be fetched
+again when next requested. This should be a decent balance between avoiding
+too-frequent fetches if your site is frequently used and staying up to date.
+
+Fully-processed blacklist data may be cached in memcached or another shared
+memory cache if it's been configured in MediaWiki.
+
+
+Stability
+---------
+
+This extension has not been widely tested outside Wikimedia. Although it has
+been in production on Wikimedia websites since December 2004, it should be
+considered experimental. Its design is simple, with little input validation, so
+unexpected behavior due to incorrect regular expression input or non-standard
+configuration is entirely possible.
+
+Obtaining or making blacklists
+------------------------------
+
+The primary source for a MediaWiki-compatible blacklist file is the Wikimedia
+spam blacklist on meta:
+
+ http://meta.wikimedia.org/wiki/Spam_blacklist
+
+In the default configuration, the extension loads this list from our site
+once every 10-15 minutes.
+
+The Wikimedia spam blacklist can only be edited by trusted administrators.
+Wikimedia hosts large, diverse wikis with many thousands of external links,
+hence the Wikimedia blacklist is comparatively conservative in the links it
+blocks. You may want to add your own keyword blocks or even ccTLD blocks.
+You may suggest modifications to the Wikimedia blacklist at:
+
+ http://meta.wikimedia.org/wiki/Talk:Spam_blacklist
+
+To make maintenance of local lists easier, you may wish to add a DB: source to
+$wgSpamBlacklistFiles and hence create a blacklist on your wiki. If you do this,
+it is strongly recommended that you protect the page from general editing.
+Besides the obvious danger that someone may add a regex that matches everything,
+please note that an attacker with the ability to input arbitrary regular
+expressions may be able to generate segfaults in the PCRE library.
+
+Whitelisting
+------------
+
+You may sometimes find that a site listed in a centrally-maintained blacklist
+contains something you nonetheless want to link to.
+
+A local whitelist can be maintained by creating a [[MediaWiki:Spam-whitelist]]
+page and listing hostnames in it, using the same format as the blacklists.
+URLs matching the whitelist will be ignored locally.
+
+Logging
+-------
+
+To aid with tracking which domains are being spammed, this extension has
+multiple logging features. By default, hits are included in the standard
+debug log (controlled by $wgDebugLogFile). You can grep for 'SpamBlacklistHit',
+which includes the IP of the user and the URL they tried to submit. This
+file is only availible for people with server access and includes private info.
+
+You can also enable logging to [[Special:Log]] by setting $wgLogSpamBlacklistHits to
+true. This will include the account which tripped the blacklist, the page title the
+edit was attempted on, and the specific URL. By default this log is only viewable
+to wiki administrators, and you can grant other groups access by giving them the
+"spamblacklistlog" permission.
+
+Copyright
+---------
+This extension and this documentation was written by Tim Starling (with later
+contributions by others) and is available under GPLv2 or any later version.
diff --git a/www/wiki/extensions/SpamBlacklist/SpamBlacklist.php b/www/wiki/extensions/SpamBlacklist/SpamBlacklist.php
new file mode 100644
index 00000000..bade5f50
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/SpamBlacklist.php
@@ -0,0 +1,14 @@
+<?php
+if ( function_exists( 'wfLoadExtension' ) ) {
+ wfLoadExtension( 'SpamBlacklist' );
+ // Keep i18n globals so mergeMessageFileList.php doesn't break
+ $wgMessagesDirs['SpamBlackList'] = __DIR__ . '/i18n';
+ wfWarn(
+ 'Deprecated PHP entry point used for SpamBlacklist extension. ' .
+ 'Please use wfLoadExtension instead, ' .
+ 'see https://www.mediawiki.org/wiki/Extension_registration for more details.'
+ );
+ return;
+} else {
+ die( 'This version of the SpamBlacklist extension requires MediaWiki 1.25+' );
+}
diff --git a/www/wiki/extensions/SpamBlacklist/SpamBlacklistHooks.php b/www/wiki/extensions/SpamBlacklist/SpamBlacklistHooks.php
new file mode 100644
index 00000000..19d9ceaa
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/SpamBlacklistHooks.php
@@ -0,0 +1,317 @@
+<?php
+
+use MediaWiki\Auth\AuthManager;
+
+/**
+ * Hooks for the spam blacklist extension
+ */
+class SpamBlacklistHooks {
+
+ public static function registerExtension() {
+ global $wgDisableAuthManager, $wgAuthManagerAutoConfig;
+
+ if ( class_exists( AuthManager::class ) && !$wgDisableAuthManager ) {
+ $wgAuthManagerAutoConfig['preauth'][SpamBlacklistPreAuthenticationProvider::class] =
+ [ 'class' => SpamBlacklistPreAuthenticationProvider::class ];
+ } else {
+ Hooks::register( 'AbortNewAccount', 'SpamBlacklistHooks::abortNewAccount' );
+ }
+ }
+
+ /**
+ * Hook function for EditFilterMergedContent
+ *
+ * @param IContextSource $context
+ * @param Content $content
+ * @param Status $status
+ * @param string $summary
+ * @param User $user
+ * @param bool $minoredit
+ *
+ * @return bool
+ */
+ static function filterMergedContent(
+ IContextSource $context,
+ Content $content,
+ Status $status,
+ $summary,
+ User $user,
+ $minoredit
+ ) {
+ $title = $context->getTitle();
+
+ // get the link from the not-yet-saved page content.
+ $editInfo = $context->getWikiPage()->prepareContentForEdit( $content );
+ $pout = $editInfo->output;
+ $links = array_keys( $pout->getExternalLinks() );
+
+ // HACK: treat the edit summary as a link if it contains anything
+ // that looks like it could be a URL or e-mail address.
+ if ( preg_match( '/\S(\.[^\s\d]{2,}|[\/@]\S)/', $summary ) ) {
+ $links[] = $summary;
+ }
+
+ $spamObj = BaseBlacklist::getInstance( 'spam' );
+ $matches = $spamObj->filter( $links, $title );
+
+ if ( $matches !== false ) {
+ $status->fatal( 'spamprotectiontext' );
+
+ foreach ( $matches as $match ) {
+ $status->fatal( 'spamprotectionmatch', $match );
+ }
+
+ $status->apiHookResult = [
+ 'spamblacklist' => implode( '|', $matches ),
+ ];
+ }
+
+ // Always return true, EditPage will look at $status->isOk().
+ return true;
+ }
+
+ public static function onParserOutputStashForEdit(
+ WikiPage $page,
+ Content $content,
+ ParserOutput $output
+ ) {
+ $links = array_keys( $output->getExternalLinks() );
+ $spamObj = BaseBlacklist::getInstance( 'spam' );
+ $spamObj->warmCachesForFilter( $page->getTitle(), $links );
+ }
+
+ /**
+ * Verify that the user can send emails
+ *
+ * @param $user User
+ * @param $hookErr array
+ * @return bool
+ */
+ public static function userCanSendEmail( &$user, &$hookErr ) {
+ /** @var $blacklist EmailBlacklist */
+ $blacklist = BaseBlacklist::getInstance( 'email' );
+ if ( $blacklist->checkUser( $user ) ) {
+ return true;
+ }
+
+ $hookErr = [ 'spam-blacklisted-email', 'spam-blacklisted-email-text', null ];
+
+ return false;
+ }
+
+ /**
+ * Processes new accounts for valid email addresses
+ *
+ * @param $user User
+ * @param $abortError
+ * @return bool
+ */
+ public static function abortNewAccount( $user, &$abortError ) {
+ /** @var $blacklist EmailBlacklist */
+ $blacklist = BaseBlacklist::getInstance( 'email' );
+ if ( $blacklist->checkUser( $user ) ) {
+ return true;
+ }
+
+ $abortError = wfMessage( 'spam-blacklisted-email-signup' )->escaped();
+ return false;
+ }
+
+ /**
+ * Hook function for EditFilter
+ * Confirm that a local blacklist page being saved is valid,
+ * and toss back a warning to the user if it isn't.
+ *
+ * @param EditPage $editPage
+ * @param string $text
+ * @param string $section
+ * @param string $hookError
+ * @return bool
+ */
+ static function validate( EditPage $editPage, $text, $section, &$hookError ) {
+ $title = $editPage->getTitle();
+ $thisPageName = $title->getPrefixedDBkey();
+
+ if ( !BaseBlacklist::isLocalSource( $title ) ) {
+ wfDebugLog( 'SpamBlacklist',
+ "Spam blacklist validator: [[$thisPageName]] not a local blacklist\n"
+ );
+ return true;
+ }
+
+ $type = BaseBlacklist::getTypeFromTitle( $title );
+ if ( $type === false ) {
+ return true;
+ }
+
+ $lines = explode( "\n", $text );
+
+ $badLines = SpamRegexBatch::getBadLines( $lines, BaseBlacklist::getInstance( $type ) );
+ if ( $badLines ) {
+ wfDebugLog( 'SpamBlacklist',
+ "Spam blacklist validator: [[$thisPageName]] given invalid input lines: " .
+ implode( ', ', $badLines ) . "\n"
+ );
+
+ $badList = "*<code>" .
+ implode( "</code>\n*<code>",
+ array_map( 'wfEscapeWikiText', $badLines ) ) .
+ "</code>\n";
+ $hookError =
+ "<div class='errorbox'>" .
+ wfMessage( 'spam-invalid-lines' )->numParams( $badLines )->text() . "<br />" .
+ $badList .
+ "</div>\n" .
+ "<br clear='all' />\n";
+ } else {
+ wfDebugLog( 'SpamBlacklist',
+ "Spam blacklist validator: [[$thisPageName]] ok or empty blacklist\n"
+ );
+ }
+
+ return true;
+ }
+
+ /**
+ * Hook function for PageContentSaveComplete
+ * Clear local spam blacklist caches on page save.
+ *
+ * @param Page $wikiPage
+ * @param User $user
+ * @param Content $content
+ * @param string $summary
+ * @param bool $isMinor
+ * @param bool $isWatch
+ * @param string $section
+ * @param int $flags
+ * @param Revision|null $revision
+ * @param Status $status
+ * @param int $baseRevId
+ *
+ * @return bool
+ */
+ static function pageSaveContent(
+ Page $wikiPage,
+ User $user,
+ Content $content,
+ $summary,
+ $isMinor,
+ $isWatch,
+ $section,
+ $flags,
+ $revision,
+ Status $status,
+ $baseRevId
+ ) {
+ if ( $revision ) {
+ BaseBlacklist::getInstance( 'spam' )
+ ->doLogging( $user, $wikiPage->getTitle(), $revision->getId() );
+ }
+
+ if ( !BaseBlacklist::isLocalSource( $wikiPage->getTitle() ) ) {
+ return true;
+ }
+
+ // This sucks because every Blacklist needs to be cleared
+ foreach ( BaseBlacklist::getBlacklistTypes() as $type => $class ) {
+ $blacklist = BaseBlacklist::getInstance( $type );
+ $blacklist->clearCache();
+ }
+
+ return true;
+ }
+
+ /**
+ * @param UploadBase $upload
+ * @param User $user
+ * @param array $props
+ * @param string $comment
+ * @param string $pageText
+ * @param array|ApiMessage &$error
+ * @return bool
+ */
+ public static function onUploadVerifyUpload(
+ UploadBase $upload,
+ User $user,
+ array $props,
+ $comment,
+ $pageText,
+ &$error
+ ) {
+ $title = $upload->getTitle();
+
+ // get the link from the not-yet-saved page content.
+ $content = ContentHandler::makeContent( $pageText, $title );
+ $parserOptions = $content->getContentHandler()->makeParserOptions( 'canonical' );
+ $output = $content->getParserOutput( $title, null, $parserOptions );
+ $links = array_keys( $output->getExternalLinks() );
+
+ // HACK: treat comment as a link if it contains anything
+ // that looks like it could be a URL or e-mail address.
+ if ( preg_match( '/\S(\.[^\s\d]{2,}|[\/@]\S)/', $comment ) ) {
+ $links[] = $comment;
+ }
+ if ( !$links ) {
+ return true;
+ }
+
+ $spamObj = BaseBlacklist::getInstance( 'spam' );
+ $matches = $spamObj->filter( $links, $title );
+
+ if ( $matches !== false ) {
+ $error = new ApiMessage(
+ wfMessage( 'spamprotectiontext' ),
+ 'spamblacklist',
+ [
+ 'spamblacklist' => [ 'matches' => $matches ],
+ 'message' => [
+ 'key' => 'spamprotectionmatch',
+ 'params' => $matches[0],
+ ],
+ ]
+ );
+ }
+
+ return true;
+ }
+
+ /**
+ * @param WikiPage $article
+ * @param User $user
+ * @param $reason
+ * @param $error
+ */
+ public static function onArticleDelete( WikiPage &$article, User &$user, &$reason, &$error ) {
+ /** @var SpamBlacklist $spam */
+ $spam = BaseBlacklist::getInstance( 'spam' );
+ if ( !$spam->isLoggingEnabled() ) {
+ return;
+ }
+
+ // Log the changes, but we only commit them once the deletion has happened.
+ // We do that since the external links table could get cleared before the
+ // ArticleDeleteComplete hook runs
+ $spam->logUrlChanges( $spam->getCurrentLinks( $article->getTitle() ), [], [] );
+ }
+
+ /**
+ * @param WikiPage $page
+ * @param User $user
+ * @param $reason
+ * @param $id
+ * @param Content|null $content
+ * @param LogEntry $logEntry
+ */
+ public static function onArticleDeleteComplete(
+ &$page,
+ User &$user,
+ $reason,
+ $id,
+ Content $content = null,
+ LogEntry $logEntry
+ ) {
+ /** @var SpamBlacklist $spam */
+ $spam = BaseBlacklist::getInstance( 'spam' );
+ $spam->doLogging( $user, $page->getTitle(), $page->getLatest() );
+ }
+}
diff --git a/www/wiki/extensions/SpamBlacklist/SpamBlacklistLogFormatter.php b/www/wiki/extensions/SpamBlacklist/SpamBlacklistLogFormatter.php
new file mode 100644
index 00000000..e0c20079
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/SpamBlacklistLogFormatter.php
@@ -0,0 +1,11 @@
+<?php
+
+class SpamBlacklistLogFormatter extends LogFormatter {
+
+ protected function getMessageParameters() {
+ $params = parent::getMessageParameters();
+ $params[3] = Message::rawParam( htmlspecialchars( $params[3] ) );
+ return $params;
+ }
+
+}
diff --git a/www/wiki/extensions/SpamBlacklist/SpamBlacklistPreAuthenticationProvider.php b/www/wiki/extensions/SpamBlacklist/SpamBlacklistPreAuthenticationProvider.php
new file mode 100644
index 00000000..0880103b
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/SpamBlacklistPreAuthenticationProvider.php
@@ -0,0 +1,15 @@
+<?php
+
+use MediaWiki\Auth\AbstractPreAuthenticationProvider;
+
+class SpamBlacklistPreAuthenticationProvider extends AbstractPreAuthenticationProvider {
+ public function testForAccountCreation( $user, $creator, array $reqs ) {
+ /** @var $blacklist EmailBlacklist */
+ $blacklist = BaseBlacklist::getInstance( 'email' );
+ if ( $blacklist->checkUser( $user ) ) {
+ return StatusValue::newGood();
+ }
+
+ return StatusValue::newFatal( 'spam-blacklisted-email-signup' );
+ }
+}
diff --git a/www/wiki/extensions/SpamBlacklist/SpamBlacklist_body.php b/www/wiki/extensions/SpamBlacklist/SpamBlacklist_body.php
new file mode 100644
index 00000000..b3fb900e
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/SpamBlacklist_body.php
@@ -0,0 +1,347 @@
+<?php
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+ exit;
+}
+
+use \MediaWiki\MediaWikiServices;
+
+class SpamBlacklist extends BaseBlacklist {
+ const STASH_TTL = 180;
+ const STASH_AGE_DYING = 150;
+
+ /**
+ * Changes to external links, for logging purposes
+ * @var array[]
+ */
+ private $urlChangeLog = [];
+
+ /**
+ * Returns the code for the blacklist implementation
+ *
+ * @return string
+ */
+ protected function getBlacklistType() {
+ return 'spam';
+ }
+
+ /**
+ * Apply some basic anti-spoofing to the links before they get filtered,
+ * see @bug 12896
+ *
+ * @param string $text
+ *
+ * @return string
+ */
+ protected function antiSpoof( $text ) {
+ $text = str_replace( '.', '.', $text );
+ return $text;
+ }
+
+ /**
+ * @param string[] $links An array of links to check against the blacklist
+ * @param Title $title The title of the page to which the filter shall be applied.
+ * This is used to load the old links already on the page, so
+ * the filter is only applied to links that got added. If not given,
+ * the filter is applied to all $links.
+ * @param bool $preventLog Whether to prevent logging of hits. Set to true when
+ * the action is testing the links rather than attempting to save them
+ * (e.g. the API spamblacklist action)
+ * @param string $mode Either 'check' or 'stash'
+ *
+ * @return string[]|bool Matched text(s) if the edit should not be allowed; false otherwise
+ */
+ function filter( array $links, Title $title = null, $preventLog = false, $mode = 'check' ) {
+ $statsd = MediaWikiServices::getInstance()->getStatsdDataFactory();
+ $cache = ObjectCache::getLocalClusterInstance();
+
+ // If there are no new links, and we are logging,
+ // mark all of the current links as being removed.
+ if ( !$links && $this->isLoggingEnabled() ) {
+ $this->logUrlChanges( $this->getCurrentLinks( $title ), [], [] );
+ }
+
+ if ( !$links ) {
+ return false;
+ }
+
+ sort( $links );
+ $key = $cache->makeKey(
+ 'blacklist',
+ $this->getBlacklistType(),
+ 'pass',
+ sha1( implode( "\n", $links ) ),
+ (string)$title
+ );
+ // Skip blacklist checks if nothing matched during edit stashing...
+ $knownNonMatchAsOf = $cache->get( $key );
+ if ( $mode === 'check' ) {
+ if ( $knownNonMatchAsOf ) {
+ $statsd->increment( 'spamblacklist.check-stash.hit' );
+
+ return false;
+ } else {
+ $statsd->increment( 'spamblacklist.check-stash.miss' );
+ }
+ } elseif ( $mode === 'stash' ) {
+ if ( $knownNonMatchAsOf && ( time() - $knownNonMatchAsOf ) < self::STASH_AGE_DYING ) {
+ return false; // OK; not about to expire soon
+ }
+ }
+
+ $blacklists = $this->getBlacklists();
+ $whitelists = $this->getWhitelists();
+
+ if ( count( $blacklists ) ) {
+ // poor man's anti-spoof, see bug 12896
+ $newLinks = array_map( [ $this, 'antiSpoof' ], $links );
+
+ $oldLinks = [];
+ if ( $title !== null ) {
+ $oldLinks = $this->getCurrentLinks( $title );
+ $addedLinks = array_diff( $newLinks, $oldLinks );
+ } else {
+ // can't load old links, so treat all links as added.
+ $addedLinks = $newLinks;
+ }
+
+ wfDebugLog( 'SpamBlacklist', "Old URLs: " . implode( ', ', $oldLinks ) );
+ wfDebugLog( 'SpamBlacklist', "New URLs: " . implode( ', ', $newLinks ) );
+ wfDebugLog( 'SpamBlacklist', "Added URLs: " . implode( ', ', $addedLinks ) );
+
+ if ( !$preventLog ) {
+ $this->logUrlChanges( $oldLinks, $newLinks, $addedLinks );
+ }
+
+ $links = implode( "\n", $addedLinks );
+
+ # Strip whitelisted URLs from the match
+ if ( is_array( $whitelists ) ) {
+ wfDebugLog( 'SpamBlacklist', "Excluding whitelisted URLs from " . count( $whitelists ) .
+ " regexes: " . implode( ', ', $whitelists ) . "\n" );
+ foreach ( $whitelists as $regex ) {
+ wfSuppressWarnings();
+ $newLinks = preg_replace( $regex, '', $links );
+ wfRestoreWarnings();
+ if ( is_string( $newLinks ) ) {
+ // If there wasn't a regex error, strip the matching URLs
+ $links = $newLinks;
+ }
+ }
+ }
+
+ # Do the match
+ wfDebugLog( 'SpamBlacklist', "Checking text against " . count( $blacklists ) .
+ " regexes: " . implode( ', ', $blacklists ) . "\n" );
+ $retVal = false;
+ foreach ( $blacklists as $regex ) {
+ wfSuppressWarnings();
+ $matches = [];
+ $check = ( preg_match_all( $regex, $links, $matches ) > 0 );
+ wfRestoreWarnings();
+ if ( $check ) {
+ wfDebugLog( 'SpamBlacklist', "Match!\n" );
+ global $wgRequest;
+ $ip = $wgRequest->getIP();
+ $fullUrls = [];
+ $fullLineRegex = substr( $regex, 0, strrpos( $regex, '/' ) ) . '.*/Sim';
+ preg_match_all( $fullLineRegex, $links, $fullUrls );
+ $imploded = implode( ' ', $fullUrls[0] );
+ wfDebugLog( 'SpamBlacklistHit', "$ip caught submitting spam: $imploded\n" );
+ if ( !$preventLog ) {
+ $this->logFilterHit( $title, $imploded ); // Log it
+ }
+ if ( $retVal === false ) {
+ $retVal = [];
+ }
+ $retVal = array_merge( $retVal, $fullUrls[1] );
+ }
+ }
+ if ( is_array( $retVal ) ) {
+ $retVal = array_unique( $retVal );
+ }
+ } else {
+ $retVal = false;
+ }
+
+ if ( $retVal === false ) {
+ // Cache the typical negative results
+ $cache->set( $key, time(), self::STASH_TTL );
+ if ( $mode === 'stash' ) {
+ $statsd->increment( 'spamblacklist.check-stash.store' );
+ }
+ }
+
+ return $retVal;
+ }
+
+ public function isLoggingEnabled() {
+ global $wgSpamBlacklistEventLogging;
+ return $wgSpamBlacklistEventLogging && class_exists( 'EventLogging' );
+ }
+
+ /**
+ * Diff added/removed urls and generate events for them
+ *
+ * @param string[] $oldLinks
+ * @param string[] $newLinks
+ * @param string[] $addedLinks
+ */
+ public function logUrlChanges( $oldLinks, $newLinks, $addedLinks ) {
+ if ( !$this->isLoggingEnabled() ) {
+ return;
+ }
+
+ $removedLinks = array_diff( $oldLinks, $newLinks );
+ foreach ( $addedLinks as $url ) {
+ $this->logUrlChange( $url, 'insert' );
+ }
+
+ foreach ( $removedLinks as $url ) {
+ $this->logUrlChange( $url, 'remove' );
+ }
+ }
+
+ /**
+ * Actually push the url change events post-save
+ *
+ * @param User $user
+ * @param Title $title
+ * @param int $revId
+ */
+ public function doLogging( User $user, Title $title, $revId ) {
+ if ( !$this->isLoggingEnabled() ) {
+ return;
+ }
+
+ $baseInfo = [
+ 'revId' => $revId,
+ 'pageId' => $title->getArticleID(),
+ 'pageNamespace' => $title->getNamespace(),
+ 'userId' => $user->getId(),
+ 'userText' => $user->getName(),
+ ];
+ $changes = $this->urlChangeLog;
+ // Empty the changes queue in case this function gets called more than once
+ $this->urlChangeLog = [];
+
+ DeferredUpdates::addCallableUpdate( function () use ( $changes, $baseInfo ) {
+ foreach ( $changes as $change ) {
+ EventLogging::logEvent(
+ 'ExternalLinksChange',
+ 15716074,
+ $baseInfo + $change
+ );
+ }
+ } );
+ }
+
+ /**
+ * Queue log data about change for a url addition or removal
+ *
+ * @param string $url
+ * @param string $action 'insert' or 'remove'
+ */
+ private function logUrlChange( $url, $action ) {
+ $parsed = wfParseUrl( $url );
+ if ( !isset( $parsed['host'] ) ) {
+ wfDebugLog( 'SpamBlacklist', "Unable to parse $url" );
+ return;
+ }
+ $info = [
+ 'action' => $action,
+ 'protocol' => $parsed['scheme'],
+ 'domain' => $parsed['host'],
+ 'path' => isset( $parsed['path'] ) ? $parsed['path'] : '',
+ 'query' => isset( $parsed['query'] ) ? $parsed['query'] : '',
+ 'fragment' => isset( $parsed['fragment'] ) ? $parsed['fragment'] : '',
+ ];
+
+ $this->urlChangeLog[] = $info;
+ }
+
+ /**
+ * Look up the links currently in the article, so we can
+ * ignore them on a second run.
+ *
+ * WARNING: I can add more *of the same link* with no problem here.
+ * @param $title Title
+ * @return array
+ */
+ function getCurrentLinks( Title $title ) {
+ $cache = ObjectCache::getMainWANInstance();
+ return $cache->getWithSetCallback(
+ // Key is warmed via warmCachesForFilter() from ApiStashEdit
+ $cache->makeKey( 'external-link-list', $title->getLatestRevID() ),
+ $cache::TTL_MINUTE,
+ function ( $oldValue, &$ttl, array &$setOpts ) use ( $title ) {
+ $dbr = wfGetDB( DB_SLAVE );
+ $setOpts += Database::getCacheSetOptions( $dbr );
+
+ return $dbr->selectFieldValues(
+ 'externallinks',
+ 'el_to',
+ [ 'el_from' => $title->getArticleID() ], // should be zero queries
+ __METHOD__
+ );
+ }
+ );
+ }
+
+ public function warmCachesForFilter( Title $title, array $entries ) {
+ $this->filter( $entries, $title, true /* no logging */, 'stash' );
+ }
+
+ /**
+ * Returns the start of the regex for matches
+ *
+ * @return string
+ */
+ public function getRegexStart() {
+ return '/(?:https?:)?\/\/+[a-z0-9_\-.]*(';
+ }
+
+ /**
+ * Returns the end of the regex for matches
+ *
+ * @param $batchSize
+ * @return string
+ */
+ public function getRegexEnd( $batchSize ) {
+ return ')' . parent::getRegexEnd( $batchSize );
+ }
+ /**
+ * Logs the filter hit to Special:Log if
+ * $wgLogSpamBlacklistHits is enabled.
+ *
+ * @param Title $title
+ * @param string $url URL that the user attempted to add
+ */
+ public function logFilterHit( $title, $url ) {
+ global $wgUser, $wgLogSpamBlacklistHits;
+ if ( $wgLogSpamBlacklistHits ) {
+ $logEntry = new ManualLogEntry( 'spamblacklist', 'hit' );
+ $logEntry->setPerformer( $wgUser );
+ $logEntry->setTarget( $title );
+ $logEntry->setParameters( [
+ '4::url' => $url,
+ ] );
+ $logid = $logEntry->insert();
+ $log = new LogPage( 'spamblacklist' );
+ if ( $log->isRestricted() ) {
+ // Make sure checkusers can see this action if the log is restricted
+ // (which is the default)
+ if ( ExtensionRegistry::getInstance()->isLoaded( 'CheckUser' )
+ && class_exists( 'CheckUserHooks' )
+ ) {
+ $rc = $logEntry->getRecentChange( $logid );
+ CheckUserHooks::updateCheckUserData( $rc );
+ }
+ } else {
+ // If the log is unrestricted, publish normally to RC,
+ // which will also update checkuser
+ $logEntry->publish( $logid, "rc" );
+ }
+ }
+ }
+}
diff --git a/www/wiki/extensions/SpamBlacklist/SpamRegexBatch.php b/www/wiki/extensions/SpamBlacklist/SpamRegexBatch.php
new file mode 100644
index 00000000..3fd6e2ee
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/SpamRegexBatch.php
@@ -0,0 +1,175 @@
+<?php
+
+/**
+ * Utility class for working with blacklists
+ */
+class SpamRegexBatch {
+ /**
+ * Build a set of regular expressions matching URLs with the list of regex fragments.
+ * Returns an empty list if the input list is empty.
+ *
+ * @param array $lines list of fragments which will match in URLs
+ * @param BaseBlacklist $blacklist
+ * @param int $batchSize largest allowed batch regex;
+ * if 0, will produce one regex per line
+ * @return array
+ */
+ static function buildRegexes( $lines, BaseBlacklist $blacklist, $batchSize=4096 ) {
+ # Make regex
+ # It's faster using the S modifier even though it will usually only be run once
+ // $regex = 'https?://+[a-z0-9_\-.]*(' . implode( '|', $lines ) . ')';
+ // return '/' . str_replace( '/', '\/', preg_replace('|\\\*/|', '/', $regex) ) . '/Sim';
+ $regexes = [];
+ $regexStart = $blacklist->getRegexStart();
+ $regexEnd = $blacklist->getRegexEnd( $batchSize );
+ $build = false;
+ foreach ( $lines as $line ) {
+ if ( substr( $line, -1, 1 ) == "\\" ) {
+ // Final \ will break silently on the batched regexes.
+ // Skip it here to avoid breaking the next line;
+ // warnings from getBadLines() will still trigger on
+ // edit to keep new ones from floating in.
+ continue;
+ }
+ // FIXME: not very robust size check, but should work. :)
+ if ( $build === false ) {
+ $build = $line;
+ } elseif ( strlen( $build ) + strlen( $line ) > $batchSize ) {
+ $regexes[] = $regexStart .
+ str_replace( '/', '\/', preg_replace( '|\\\*/|u', '/', $build ) ) .
+ $regexEnd;
+ $build = $line;
+ } else {
+ $build .= '|';
+ $build .= $line;
+ }
+ }
+ if ( $build !== false ) {
+ $regexes[] = $regexStart .
+ str_replace( '/', '\/', preg_replace( '|\\\*/|u', '/', $build ) ) .
+ $regexEnd;
+ }
+ return $regexes;
+ }
+
+ /**
+ * Confirm that a set of regexes is either empty or valid.
+ *
+ * @param $regexes array set of regexes
+ * @return bool true if ok, false if contains invalid lines
+ */
+ static function validateRegexes( $regexes ) {
+ foreach ( $regexes as $regex ) {
+ wfSuppressWarnings();
+ $ok = preg_match( $regex, '' );
+ wfRestoreWarnings();
+
+ if ( $ok === false ) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Strip comments and whitespace, then remove blanks
+ *
+ * @param $lines array
+ * @return array
+ */
+ static function stripLines( $lines ) {
+ return array_filter(
+ array_map( 'trim',
+ preg_replace( '/#.*$/', '',
+ $lines ) ) );
+ }
+
+ /**
+ * Do a sanity check on the batch regex.
+ *
+ * @param $lines string unsanitized input lines
+ * @param $blacklist BaseBlacklist
+ * @param $fileName bool|string optional for debug reporting
+ * @return array of regexes
+ */
+ static function buildSafeRegexes( $lines, BaseBlacklist $blacklist, $fileName=false ) {
+ $lines = self::stripLines( $lines );
+ $regexes = self::buildRegexes( $lines, $blacklist );
+ if ( self::validateRegexes( $regexes ) ) {
+ return $regexes;
+ } else {
+ // _Something_ broke... rebuild line-by-line; it'll be
+ // slower if there's a lot of blacklist lines, but one
+ // broken line won't take out hundreds of its brothers.
+ if ( $fileName ) {
+ wfDebugLog( 'SpamBlacklist', "Spam blacklist warning: bogus line in $fileName\n" );
+ }
+ return self::buildRegexes( $lines, $blacklist, 0 );
+ }
+ }
+
+ /**
+ * Returns an array of invalid lines
+ *
+ * @param array $lines
+ * @param $blacklist BaseBlacklist
+ * @return array of input lines which produce invalid input, or empty array if no problems
+ */
+ static function getBadLines( $lines, BaseBlacklist $blacklist ) {
+ $lines = self::stripLines( $lines );
+
+ $badLines = [];
+ foreach ( $lines as $line ) {
+ if ( substr( $line, -1, 1 ) == "\\" ) {
+ // Final \ will break silently on the batched regexes.
+ $badLines[] = $line;
+ }
+ }
+
+ $regexes = self::buildRegexes( $lines, $blacklist );
+ if ( self::validateRegexes( $regexes ) ) {
+ // No other problems!
+ return $badLines;
+ }
+
+ // Something failed in the batch, so check them one by one.
+ foreach ( $lines as $line ) {
+ $regexes = self::buildRegexes( [ $line ], $blacklist );
+ if ( !self::validateRegexes( $regexes ) ) {
+ $badLines[] = $line;
+ }
+ }
+ return $badLines;
+ }
+
+ /**
+ * Build a set of regular expressions from the given multiline input text,
+ * with empty lines and comments stripped.
+ *
+ * @param $source string
+ * @param $blacklist BaseBlacklist
+ * @param $fileName bool|string optional, for reporting of bad files
+ * @return array of regular expressions, potentially empty
+ */
+ static function regexesFromText( $source, BaseBlacklist $blacklist, $fileName=false ) {
+ $lines = explode( "\n", $source );
+ return self::buildSafeRegexes( $lines, $blacklist, $fileName );
+ }
+
+ /**
+ * Build a set of regular expressions from a MediaWiki message.
+ * Will be correctly empty if the message isn't present.
+ *
+ * @param $message string
+ * @param $blacklist BaseBlacklist
+ * @return array of regular expressions, potentially empty
+ */
+ static function regexesFromMessage( $message, BaseBlacklist $blacklist ) {
+ $source = wfMessage( $message )->inContentLanguage();
+ if ( !$source->isDisabled() ) {
+ return self::regexesFromText( $source->plain(), $blacklist );
+ } else {
+ return [];
+ }
+ }
+}
diff --git a/www/wiki/extensions/SpamBlacklist/api/ApiSpamBlacklist.php b/www/wiki/extensions/SpamBlacklist/api/ApiSpamBlacklist.php
new file mode 100644
index 00000000..bda079f1
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/api/ApiSpamBlacklist.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * SpamBlacklist extension API
+ *
+ * Copyright © 2013 Wikimedia Foundation
+ * Based on code by Ian Baker, Victor Vasiliev, Bryan Tong Minh, Roan Kattouw,
+ * Alex Z., and Jackmcbarn
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/**
+ * Query module check a URL against the blacklist
+ *
+ * @ingroup API
+ * @ingroup Extensions
+ */
+class ApiSpamBlacklist extends ApiBase {
+
+ public function execute() {
+ $params = $this->extractRequestParams();
+ $matches = BaseBlacklist::getInstance( 'spam' )->filter( $params['url'], null, true );
+ $res = $this->getResult();
+
+ if ( $matches !== false ) {
+ // this url is blacklisted.
+ $res->addValue( 'spamblacklist', 'result', 'blacklisted' );
+ $res->setIndexedTagName( $matches, 'match' );
+ $res->addValue( 'spamblacklist', 'matches', $matches );
+ } else {
+ // not blacklisted
+ $res->addValue( 'spamblacklist', 'result', 'ok' );
+ }
+ }
+
+ public function getAllowedParams() {
+ return [
+ 'url' => [
+ ApiBase::PARAM_REQUIRED => true,
+ ApiBase::PARAM_ISMULTI => true,
+ ]
+ ];
+ }
+
+ /**
+ * @see ApiBase::getExamplesMessages()
+ */
+ protected function getExamplesMessages() {
+ return [
+ 'action=spamblacklist&url=http://www.example.com/|http://www.example.org/'
+ => 'apihelp-spamblacklist-example-1',
+ ];
+ }
+
+ public function getHelpUrls() {
+ return [ 'https://www.mediawiki.org/wiki/Extension:SpamBlacklist/API' ];
+ }
+}
diff --git a/www/wiki/extensions/SpamBlacklist/cleanup.php b/www/wiki/extensions/SpamBlacklist/cleanup.php
new file mode 100644
index 00000000..8eb23ce1
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/cleanup.php
@@ -0,0 +1,126 @@
+<?php
+
+/**
+ * An aggressive spam cleanup script.
+ * Searches the database for matching pages, and reverts them to the last non-spammed revision.
+ * If all revisions contain spam, deletes the page
+ */
+
+require_once( '../../maintenance/commandLine.inc' );
+require_once( 'SpamBlacklist_body.php' );
+
+/**
+ * Find the latest revision of the article that does not contain spam and revert to it
+ */
+function cleanupArticle( Revision $rev, $regexes, $match ) {
+ $title = $rev->getTitle();
+ $revId = $rev->getId();
+ while ( $rev ) {
+ $matches = false;
+ foreach ( $regexes as $regex ) {
+ $matches = $matches || preg_match( $regex, $rev->getText() );
+ }
+ if ( !$matches ) {
+ // Didn't find any spam
+ break;
+ }
+ # Revision::getPrevious can't be used in this way before MW 1.6 (Revision.php 1.26)
+ #$rev = $rev->getPrevious();
+ $revId = $title->getPreviousRevisionID( $revId );
+ if ( $revId ) {
+ $rev = Revision::newFromTitle( $title, $revId );
+ } else {
+ $rev = false;
+ }
+ }
+ if ( !$rev ) {
+ // Didn't find a non-spammy revision, delete the page
+ /*
+ print "All revisions are spam, deleting...\n";
+ $article = new Article( $title );
+ $article->doDeleteArticle( "All revisions matched the spam blacklist" );
+ */
+ // Too scary, blank instead
+ print "All revisions are spam, blanking...\n";
+ $text = '';
+ $comment = "All revisions matched the spam blacklist ($match), blanking";
+ } else {
+ // Revert to this revision
+ $text = $rev->getText();
+ $comment = "Cleaning up links to $match";
+ }
+ $wikiPage = new WikiPage( $title );
+ $wikiPage->doEdit( $text, $comment );
+}
+
+//------------------------------------------------------------------------------
+
+$username = 'Spam cleanup script';
+if ( method_exists( 'User', 'newSystemUser' ) ) {
+ $wgUser = User::newSystemUser( $username, array( 'steal' => true ) );
+} else {
+ $wgUser = User::newFromName( $username );
+ if ( $wgUser->idForName() == 0 ) {
+ // Create the user
+ $status = $wgUser->addToDatabase();
+ if ( $status === null || $status->isOK() ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->update( 'user', array( 'user_password' => 'nologin' ),
+ array( 'user_name' => $username ), $username );
+ }
+ }
+}
+
+if ( isset( $options['n'] ) ) {
+ $dryRun = true;
+} else {
+ $dryRun = false;
+}
+
+$sb = new SpamBlacklist( $wgSpamBlacklistSettings );
+if ( $wgSpamBlacklistFiles ) {
+ $sb->files = $wgSpamBlacklistFiles;
+}
+$regexes = $sb->getBlacklists();
+if ( !$regexes ) {
+ print "Invalid regex, can't clean up spam\n";
+ exit( 1 );
+}
+
+$dbr = wfGetDB( DB_SLAVE );
+$maxID = $dbr->selectField( 'page', 'MAX(page_id)' );
+$reportingInterval = 100;
+
+print "Regexes are " . implode( ', ', array_map( 'count', $regexes ) ) . " bytes\n";
+print "Searching for spam in $maxID pages...\n";
+if ( $dryRun ) {
+ print "Dry run only\n";
+}
+
+for ( $id = 1; $id <= $maxID; $id++ ) {
+ if ( $id % $reportingInterval == 0 ) {
+ printf( "%-8d %-5.2f%%\r", $id, $id / $maxID * 100 );
+ }
+ $revision = Revision::loadFromPageId( $dbr, $id );
+ if ( $revision ) {
+ $text = $revision->getText();
+ if ( $text ) {
+ foreach ( $regexes as $regex ) {
+ if ( preg_match( $regex, $text, $matches ) ) {
+ $title = $revision->getTitle();
+ $titleText = $title->getPrefixedText();
+ if ( $dryRun ) {
+ print "\nFound spam in [[$titleText]]\n";
+ } else {
+ print "\nCleaning up links to {$matches[0]} in [[$titleText]]\n";
+ $match = str_replace( 'http://', '', $matches[0] );
+ cleanupArticle( $revision, $regexes, $match );
+ }
+ }
+ }
+ }
+ }
+}
+// Just for satisfaction
+printf( "%-8d %-5.2f%%\n", $id - 1, ( $id - 1 ) / $maxID * 100 );
+
diff --git a/www/wiki/extensions/SpamBlacklist/composer.json b/www/wiki/extensions/SpamBlacklist/composer.json
new file mode 100644
index 00000000..b822010c
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/composer.json
@@ -0,0 +1,23 @@
+{
+ "require-dev": {
+ "jakub-onderka/php-parallel-lint": "1.0.0",
+ "jakub-onderka/php-console-highlighter": "0.3.2",
+ "mediawiki/mediawiki-codesniffer": "18.0.0",
+ "mediawiki/minus-x": "0.3.1",
+ "mediawiki/mediawiki-phan-config": "0.2.0"
+ },
+ "scripts": {
+ "fix": [
+ "phpcbf",
+ "minus-x fix ."
+ ],
+ "test": [
+ "parallel-lint . --exclude node_modules --exclude vendor",
+ "phpcs -p -s",
+ "minus-x check ."
+ ]
+ },
+ "extra": {
+ "phan-taint-check-plugin": "1.2.0"
+ }
+}
diff --git a/www/wiki/extensions/SpamBlacklist/extension.json b/www/wiki/extensions/SpamBlacklist/extension.json
new file mode 100644
index 00000000..f8317b2a
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/extension.json
@@ -0,0 +1,95 @@
+{
+ "name": "SpamBlacklist",
+ "author": [
+ "Tim Starling",
+ "John Du Hart",
+ "Daniel Kinzler"
+ ],
+ "url": "https://www.mediawiki.org/wiki/Extension:SpamBlacklist",
+ "descriptionmsg": "spam-blacklist-desc",
+ "type": "antispam",
+ "license-name": "GPL-2.0-or-later",
+ "requires": {
+ "MediaWiki": ">= 1.31.0"
+ },
+ "GroupPermissions": {
+ "user": {
+ "spamblacklistlog": true
+ }
+ },
+ "AvailableRights": [
+ "spamblacklistlog"
+ ],
+ "LogTypes": [
+ "spamblacklist"
+ ],
+ "LogRestrictions": {
+ "spamblacklist": "spamblacklistlog"
+ },
+ "LogActionsHandlers": {
+ "spamblacklist/*": "SpamBlacklistLogFormatter"
+ },
+ "GrantPermissions": {
+ "viewrestrictedlogs": {
+ "spamblacklistlog": true
+ }
+ },
+ "APIModules": {
+ "spamblacklist": "ApiSpamBlacklist"
+ },
+ "MessagesDirs": {
+ "SpamBlackList": [
+ "i18n"
+ ]
+ },
+ "AutoloadClasses": {
+ "ApiSpamBlacklist": "includes/ApiSpamBlacklist.php",
+ "BaseBlacklist": "includes/BaseBlacklist.php",
+ "EmailBlacklist": "includes/EmailBlacklist.php",
+ "SpamBlacklistHooks": "includes/SpamBlacklistHooks.php",
+ "SpamBlacklist": "includes/SpamBlacklist.php",
+ "SpamBlacklistLogFormatter": "includes/SpamBlacklistLogFormatter.php",
+ "SpamRegexBatch": "includes/SpamRegexBatch.php",
+ "SpamBlacklistPreAuthenticationProvider": "includes/SpamBlacklistPreAuthenticationProvider.php"
+ },
+ "Hooks": {
+ "EditFilterMergedContent": [
+ "SpamBlacklistHooks::filterMergedContent"
+ ],
+ "EditFilter": [
+ "SpamBlacklistHooks::validate"
+ ],
+ "PageContentSaveComplete": [
+ "SpamBlacklistHooks::pageSaveContent"
+ ],
+ "UserCanSendEmail": [
+ "SpamBlacklistHooks::userCanSendEmail"
+ ],
+ "ParserOutputStashForEdit": [
+ "SpamBlacklistHooks::onParserOutputStashForEdit"
+ ],
+ "UploadVerifyUpload": [
+ "SpamBlacklistHooks::onUploadVerifyUpload"
+ ],
+ "ArticleDelete": "SpamBlacklistHooks::onArticleDelete",
+ "ArticleDeleteComplete": "SpamBlacklistHooks::onArticleDeleteComplete"
+ },
+ "config": {
+ "BlacklistSettings": {
+ "spam": {
+ "files": [ "https://meta.wikimedia.org/w/index.php?title=Spam_blacklist&action=raw&sb_ver=1" ]
+ },
+ "_merge_strategy": "array_plus_2d"
+ },
+ "LogSpamBlacklistHits": false,
+ "SpamBlacklistEventLogging": false
+ },
+ "AuthManagerAutoConfig": {
+ "preauth": {
+ "SpamBlacklistPreAuthenticationProvider": {
+ "class": "SpamBlacklistPreAuthenticationProvider"
+ }
+ }
+ },
+ "manifest_version": 1
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/ais.json b/www/wiki/extensions/SpamBlacklist/i18n/ais.json
new file mode 100644
index 00000000..1f438f85
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/ais.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Benel",
+ "Bunukwiki"
+ ]
+ },
+ "spam-blacklist": "#<!—amana pisumad tina tusil --> <pre>\n# amahicahica micunus ta kasabelih a hekal URL i tina piazihan tu sulit amalangat.\n# tina piazihan tu sulit silaheciay a subal dada’ i tina Wiki, kahica nu kawaw piazih tu tatenga’ay sacahamin-subal malangat piazihan tu sulit.\n# mahizaay a cudad piazih tu tatenga’ay https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# kamu-sakilul kese tinaku isasa’ay:\n# * amahicahica nay \"#\" tatebanan nu nisulitan angangan a tusil u buhci tu kamu amin \n# * amahicahica caay inayi’ ku cacan a tusil apakuhica tatungusay pakatineng a zateng sapisasutili’ URL a angangan-kikay kalungangan \n #</pre> <!—amana pisumad tina tusil -->",
+ "spam-whitelist": "#<!—amana pisumad tina tusil --> <pre>\n# amahicahica hekal URL itini piazihan-tu-sulit *caay* amalangat \n# kanahatu macunus tuway i malangatay a piazihan-tu-sulit.\n#\n# kamu-sakilul kese mahiza isasa’ay:\n# * amahicahica nay \"#\" tatebanan nu nisulitan angangan a tusil u buhci tu kamu amin \n# * amahicahica caay inayi’ ku cacan a tusil apakuhica tatungusay pakatineng a zateng sapisasutili’ URL a angangan-kikay kalungangan \n \n#</pre> <!—amana pisumad tina tusil -->",
+ "email-blacklist": "#<!—amana pisumad tina tusil --> <pre>\n# amahicahica pangangan saca patayzaan a imyiyo(Email) puenengan i tina piazihan tu sulit amalangat.\n# tina piazihan tu sulit silaheciay a subal dada’ i tina Wiki, kahica nu kawaw piazih tu tatenga’ay sacahamin-subal malangat piazihan tu sulit.\n# mahizaay a cudad piazih tu tatenga’ay https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# kamu-sakilul kese tinaku isasa’ay:\n# * amahicahica nay \"#\" tatebanan nu nisulitan angangan a tusil u buhci tu kamu amin\n# * amahicahica caay nayi’ ku cacan a silsil apahica ku tatungusay pakatineng a zateng sapihica sasutili’ imyiyo(Email) puenengan a angangan-kikay kalungangan \n#</pre> <!—amana pisumad tina tusil -->",
+ "email-whitelist": "#<!—amana pisumad tina tusil --> <pre>\n# amahicahica hekal URL itini piazihan-tu-sulit *caay* amalangat \n# kanahatu macunus tuway i malangatay a piazihan-tu-sulit。\n#\n# kamu-sakilul kese mahiza isasa’ay:\n# * amahicahica nay \"#\" tatebanan nu nisulitan angangan a tusil u buhci tu kamu amin \n# * amahicahica caay inayi’ ku cacan a tusil apakuhica tatungusay pakatineng a zateng sapisasutili’ URL a angangan-kikay kalungangan \n \n #</pre> <!—amana pisumad tina tusil --> ",
+ "spam-blacklisted-email": "pasilsil tuway milangat piazihan-tu-sulit a imyiyo(email) puenengan",
+ "spam-blacklisted-email-text": "numisuay imyiyo(email) puenengan ayza mapacumud tu malangat piazihan tu sulit, a mitena’ tunumisu pabahel tu imyiyo (email) pabeli tu zumaay a misaungayay.",
+ "spam-blacklisted-email-signup": "nipabeliay a imyiyo(email) puenengan ayzasa mapasilsil tu malangat piazihan tu sulit,la’cus pisaungay",
+ "spam-invalid-lines": "isasa’ patahtah a langat piazihan-tu-sulit izaw ku{{PLURAL:$1|cacay|yadah}} pisaungay tu la’cusay a tatungusay pakatineng a zateng, kanca misumad kyu kapah misuped tina kasabelih.",
+ "spam-blacklist-desc": "i tatungusay pakatineng a zateng tu palana’an a mitena’ patahtah sakaluk, taneng malangat ku kasabelih labu’ay URL atu pangangan tu misaungayay a Email ngangan nu luma’.",
+ "log-name-spamblacklist": "patahtah a malangat ku nasulitan",
+ "log-description-spamblacklist": "tina belih nasulit tu sacahamin matatungus patahtah malangat piazihan-tu-sulit a sikawaw.",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}} i $3 mitanam micunus a $4 matatungus patahtah malangat piazihan tu sulit labu’ay kasacacay.",
+ "right-spamblacklistlog": "ciwsace patahtah malangat nasulitan-nazipa’an"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/an.json b/www/wiki/extensions/SpamBlacklist/i18n/an.json
new file mode 100644
index 00000000..de46455e
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/an.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Juanpabl"
+ ]
+ },
+ "spam-blacklist": " # As URLs externas que concuerden con ista lista serán bloqueyatas quan s'encluyan en una pachina.\n # Ista lista afecta sólo ta ista wiki; mire-se tamién a lista negra global.\n # Más decumentación en https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- leave this line exactly as it is --> <pre>\n#\n# A sintaxi ye asinas:\n# * Tot o que bi ha dende un carácter \"#\" dica a fin d'a linia ye un comentario\n# * As linias no buedas son fragmentos d'expresions regulars que sólo concordarán con hosts adintro d'as URLs\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# As URLs externas que concuerden con ista lista *no* serán bloqueyatas\n# mesmo si han estato bloqueyatas por dentradas d'a lista negra.\n#\n# A sintaxi ye asinas:\n# * Tot o que bi ha dende o carácter \"#\" dica a fin d'a linia ye un comentario\n# * As linias no buedas ye un fragmento d'expresión regular que sólo concordarán con hosts adintro d'as URLs\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "email-blacklist": "# As adrezas de correu electronico que coincidan con ista lista se bloqueyarán ta o rechistro u ninviamiento de correus!\n# Ista lista no afecta que a iste wiki; Mire-se tamién a lista negra global.\n# Ta la documentación, mire-se https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#<!-- Deixe ista linia exactament como ye --> <pre>\n#\n# A sintaxi ye a siguient:\n # * Tot texto a la dreita d'o caracter \"#\" dica la fin d'a linia ye un comentario\n # * Toda linia que no sía en blanco ye un fragmento de codigo que compararán os servidors con as adrezas de correu electronico\n#</pre> <!-- Deixe ista linia como ye-->",
+ "email-whitelist": " #<!-- Deixe ista linia como ye --> <pre>\n# As adrezas de correu electronico que amaneixen en ista lista *no* serán bloqueyadas mesmo si s'hesen habiu de bloquiar por amaneixer en a lista negra.\n#\n #</pre> <!-- Deixe ista linia como ye-->\n# A sintaxi ye a siguient:\n# * Tot texto a la dreita d'o caracter \"#\" dica a fin d'a linia ye un comentario\n# * Toda linia que no sía en blanco ye un fragmento de codigo que os servidors compararán con as adrezas de correu electronico",
+ "spam-blacklisted-email": "Adreza de correu electronico en a lista negra",
+ "spam-blacklisted-email-text": "A suya adreza de correu-e ye agora en a lista negra, y no puede ninviar correu ta atros usuarios.",
+ "spam-blacklisted-email-signup": "L'adreza de correu-e que ha dau ye actualment en a lista negra, y no se puede fer servir.",
+ "spam-invalid-lines": "{{PLURAL:$1|A linia siguient ye una|As linias siguients son}} {{PLURAL:$1|expresión regular|expresions regulars}} y {{PLURAL:$1|ha|han}} d'estar correchitas antes d'alzar a pachina:",
+ "spam-blacklist-desc": "Ferramienta anti-spam basata en expresions regulars (regex): [[MediaWiki:Spam-blacklist]] y [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/ar.json b/www/wiki/extensions/SpamBlacklist/i18n/ar.json
new file mode 100644
index 00000000..af3ae848
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/ar.json
@@ -0,0 +1,29 @@
+{
+ "@metadata": {
+ "authors": [
+ "Asaifm",
+ "Meno25",
+ "OsamaK",
+ "Abanima",
+ "Maroen1990"
+ ]
+ },
+ "spam-blacklist": " # الوصلات الخارجية التي تطابق هذه القائمة سيتم منعها عند إضافتها لصفحة.\n # هذه القائمة تؤثر فقط على هذه الويكي؛ ارجع أيضا للقائمة السوداء العامة.\n # للوثائق انظر https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- اترك هذا السطر تماما كما هو --> <pre>\n#\n# الصيغة كالتالي:\n# * كل شيء من علامة \"#\" إلى آخر السطر هو تعليق\n# * كل سطر غير فارغ هو تعبير منتظم يوافق فقط المضيفين داخل الوصلات الخارجية\n\n #</pre> <!-- اترك هذا السطر تماما كما هو -->",
+ "spam-whitelist": " #<!-- اترك هذا السطر تماما كما هو --> <pre>\n# الوصلات الخارجية التي تطابق هذه القائمة *لن* يتم منعها حتى لو\n# كانت ممنوعة بواسطة مدخلات القائمة السوداء.\n#\n# الصيغة كالتالي:\n# * كل شيء من علامة \"#\" إلى آخر السطر هو تعليق\n# * كل سطر غير فارغ هو تعبير منتظم يطابق فقط المضيفين داخل الوصلات الخارجية\n\n #</pre> <!-- اترك هذا السطر تماما كما هو -->",
+ "email-blacklist": " #<!-- leave this line exactly as it is --> <pre>\n# عناوين البريد الإلكتروني التي تطابق هذه القائمة سيتم منعها من التسجيل أو إرسال رسائل البريد الإلكتروني\n# هذه القائمة تؤثر فقط على هذه الويكي; ارجع أيضا إلى القائمة السوداء العالمية.\n# للتوثيق انظر https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# الصيغة كالتالي:\n# * كل شيء من حرف \"#\" حتى نهاية السطر هو تعليق\n# * كل سطر غير فارغ هو تعبير ريجيكس والذي سيطابق فقط المضيفين داخل عناوين البريد الإلكتروني\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "email-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# عناوين البريد الإلكتروني التي تطابق هذه القائمة *لن* يتم منعها حتى لو كانت\n# سيتم منعها عن طريق مدخلات القائمة السوداء.\n#\n# الصيغة كالتالي:\n# * كل شيء من حرف \"#\" حتى نهاية السطر هو تعليق\n# * كل سطر غير فارغ هو تعبير ريجيكس والذي سيطابق فقط المضيفين داخل عناوين البريد الإلكتروني\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-blacklisted-email": "هذا البريد الإلكتروني مدرج في القائمة السوداء",
+ "spam-blacklisted-email-text": "بريدك الإلكتروني مدرج في القائمة السوداء وبناءً على ذلك لا يمكنك استخدامه لإرسال رسائل للمستخدمين الأخرين.",
+ "spam-blacklisted-email-signup": "هذا البريد الإلكتروني مدرج في القائمة السوداء وممنوع من الإستخدام.",
+ "spam-invalid-lines": "{{PLURAL:$1||السطر التالي|السطران التاليان|السطور التالية}} في قائمة السبام السوداء {{PLURAL:$1|ليس تعبيرًا منتظمًا صحيحًا|ليسا تعبيرين منتظمين صحيحين|ليست تعبيرات منتظمة صحيحة}} و{{PLURAL:$1||يحتاج|يحتاجان|تحتاج}} إلى أن {{PLURAL:$1||يصحح|يصححان|تصحح}} قبل حفظ الصفحة:",
+ "spam-blacklist-desc": "أداة ضد السخام تعتمد على التعبيرات النمطية وتسمح بمنع روابط في الصفحات وعنواين البريد الإلكتروني للمستخدمين المسجلين",
+ "log-name-spamblacklist": "سجل السخام المدرج على القائمة السوداء",
+ "log-description-spamblacklist": "هذا الأحداث توثق مشاهدات القائمة السوداء للسخام.",
+ "logentry-spamblacklist-hit": "أدى التعديل الذي {{GENDER:$2|قام|قامت}} به $1 إلى تفعيل القائمة السوداء لوصلات السبام في $3 عندما {{GENDER:$2|حاول|حاولت}} إضافة $4.",
+ "right-spamblacklistlog": "اعرض سجل السخام المدرج على القائمة السوداء",
+ "action-spamblacklistlog": "اعرض سجل السخام المدرج على القائمة السوداء",
+ "apihelp-spamblacklist-description": "تحقق من مسار واحد أو أكثر ضد قائمة السبام السوداء.",
+ "apihelp-spamblacklist-summary": "تحقق من مسار واحد أو أكثر ضد قائمة السبام السوداء.",
+ "apihelp-spamblacklist-param-url": "المسارات للتحقيق ضد القائمة السوداء.",
+ "apihelp-spamblacklist-example-1": "تحقق من مسارين في القائمة السوداء"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/arz.json b/www/wiki/extensions/SpamBlacklist/i18n/arz.json
new file mode 100644
index 00000000..b1052c90
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/arz.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "Meno25",
+ "Ramsis II"
+ ]
+ },
+ "spam-blacklist": " # اللينكات الخارجية اللى بتطابق الليستة دى ح تتمنع لما تضاف لصفحة.\n # اللستة دى بتأثر بس على الويكى دى؛ ارجع كمان للبلاك ليست العامة.\n # للوثايق شوف https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- سيب السطر دا زى ما هو كدا بالظبط--> <pre>\n#\n# الصيغة كدا:\n# * كل حاجة من علامة \"#\" لحد آخر السطر هو تعليق\n# * كل سطر مش فاضى هو تعبير منتظم بيوافق بس المضيفين جوه الوصلات الخارجية\n\n #</pre> <!-- سيب السطر دا زى ما هو كدا بالظبط-->",
+ "spam-whitelist": " #<!-- سيب السطر دا زى ما هو كدا بالظبط --> <pre>\n# اللينكات الخارجية اللى بتطابق اللستة دى *مش* ح تتمنع حتى لو\n# كانت ممنوعة بواسطة مدخلات البلاك ليست.\n#\n# الصيغة كدا:\n# * كل حاجة من علامة \"#\" لحد آخر السطر هو تعليق\n# * كل سطر مش فاضى هو تعبير منتظم بيطابق بس المضيفين جوه الوصلات الخارجية\n\n #</pre> <!-- سيب السطر دا زى ما هو كدا بالظبط-->",
+ "spam-invalid-lines": "{{PLURAL:$1|السطر دا|السطور دول}} اللى فى السبام بلاك ليست {{PLURAL:$1|هو تعبير منتظم |هى تعبيرات منتظمة}} مش صح و {{PLURAL:$1|محتاج|محتاجين}} تصليح قبل حفظ الصفحة:",
+ "spam-blacklist-desc": "اداة انتي-سبام مبنية على اساس ريجيكس: [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/as.json b/www/wiki/extensions/SpamBlacklist/i18n/as.json
new file mode 100644
index 00000000..552e70b2
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/as.json
@@ -0,0 +1,18 @@
+{
+ "@metadata": {
+ "authors": [
+ "Bishnu Saikia",
+ "Gitartha.bordoloi"
+ ]
+ },
+ "spam-blacklist": "# এই তালিকাৰ লগত মিলা বাহিৰা URLবোৰ পৃষ্ঠাত যোগ কৰোঁতে অৱৰোধ কৰা হ'ব।\n# এই তালিকাই কেৱল এই ৱিকিত প্ৰভাৱ পেলায়; গোলকীয় ব্লেকলিষ্টখনো চাওক।\n# নথিকৰণৰ বাবে https://www.mediawiki.org/wiki/Extension:SpamBlacklist চাওক।\n# <!-- leave this line exactly as it is --> <pre>\n#\n# বিন্যাস তলত দিয়া ধৰণৰ:\n# * \"#\" চিহ্নৰ পৰা শাৰীৰ শেষলৈকে সকলোখিনিয়েই মন্তব্য।\n# * প্ৰতিটো অশূন্য শাৰী একোটা ৰেজেক্স খণ্ডাংশ যি কেৱল URLৰ ভিতৰৰ hostৰ লগত মিলিব\n\n#</pre> <!-- leave this line exactly as it is -->",
+ "spam-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# এই তালিকাৰ লগত মিলা বাহিৰা URLসমূহ অৱৰোধ কৰা *নহ'ব* যদিও সেইবোৰ\n# ব্লেকলিষ্ট ভুক্তিৰ দ্বাৰা অৱৰোধ হ'ব।\n#\n #</pre> <!-- leave this line exactly as it is -->",
+ "email-blacklist": "# এই তালিকাৰ লগত মিলা ই-মেইল ঠিকনাৰ পৰা পঞ্জীয়ন বা ই-মেইল পঠিওৱা অৱৰোধ কৰা হ'ব।\n# এই তালিকাই কেৱল এই ৱিকিত প্ৰভাৱ পেলায়; গোলকীয় ব্লেকলিষ্টখনো চাওক।\n# নথিকৰণৰ বাবে https://www.mediawiki.org/wiki/Extension:SpamBlacklist চাওক।\n#<!-- leave this line exactly as it is --> <pre>\n#\n# বিন্যাস তলত দিয়া ধৰণৰ:\n# * \"#\" চিহ্নৰ পৰা শাৰীৰ শেষলৈকে সকলোখিনিয়েই মন্তব্য।\n# * প্ৰতিটো অশূন্য শাৰী এটা ৰেজেক্স খণ্ডাংশ যি কেৱল ই-মেইল ঠিকনাবোৰৰ ভিতৰৰ হ'ষ্টৰ লগত মিলিব।\n\n#</pre> <!-- leave this line exactly as it is -->",
+ "email-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# এই তালিকাৰ লগত মিলা বাহিৰা ই-মেইলসমূহ অৱৰোধ কৰা *নহ'ব* যদিও সেইবোৰ\n# ব্লেকলিষ্ট ভুক্তিৰ দ্বাৰা অৱৰোধ হ'ব পাৰে।\n#\n #</pre> <!-- leave this line exactly as it is -->\n# বিন্যাস তলত দিয়া ধৰণৰ:\n# * \"#\" চিহ্নৰ পৰা শাৰীৰ শেষলৈকে সকলোখিনি মন্তব্য।\n3 * প্ৰতিটো অশূন্য শাৰী এটা ৰেজেক্স খণ্ডাংশ যি কেৱল ই-মেইল ঠিকনাৰ ভিতৰৰ হ'ষ্টৰ লগত মিলিব।",
+ "spam-blacklisted-email": "ব্লেকলিষ্টেড ই-মেইল ঠিকনা",
+ "spam-blacklisted-email-text": "আন সদস্যলৈ ই-মেইল পঠিয়াব নোৱাৰাকৈ আপোনাৰ ই-মেইল ঠিকনা ব্লেকলিষ্টেড কৰা হৈছে।",
+ "spam-blacklisted-email-signup": "ই-মেইল ঠিকনাটো ব্যৱহাৰৰ পৰা ব্লেকলিষ্টেড কৰা হৈছে।",
+ "spam-invalid-lines": "তলৰ স্পাম ব্লেকলিষ্টৰ {{PLURAL:$1|শাৰীটোত|শাৰীসমূহত}} অবৈধ নিয়মিত {{PLURAL:$1|এক্সপ্ৰেছন|এক্সপ্ৰেছন}} আছে আৰু সেইবোৰ পৃষ্ঠা সাঁচি থোৱাৰ আগতেই ঠিক কৰাটো {{PLURAL:$1|প্ৰয়োজন|প্ৰয়োজন}}:",
+ "spam-blacklist-desc": "ৰেজেক্স-ভিত্তিক স্পামবিৰোধী সঁজুলি: [[MediaWiki:Spam-blacklist]] আৰু [[MediaWiki:Spam-whitelist]]",
+ "right-spamblacklistlog": "স্পাম কলাতালিকা অভিলেখ চাওক"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/ast.json b/www/wiki/extensions/SpamBlacklist/i18n/ast.json
new file mode 100644
index 00000000..1b3074b9
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/ast.json
@@ -0,0 +1,26 @@
+{
+ "@metadata": {
+ "authors": [
+ "Esbardu",
+ "Xuacu"
+ ]
+ },
+ "spam-blacklist": "#<!-- dexa esta llinia exautamente como ta --> <pre>\n# Les URLs esternes que casen con esta llista bloquiaránse cuando s'amiesten a una páxina.\n# Esta llista afeuta namái a esta wiki; mira tamién la llista negra global.\n# Pa ver la documentación visita https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# La sintaxis ye ésta:\n# * Tol testu dende un caráuter \"#\" hasta fin de llinia ye un comentariu\n# * Toa llinia non balera ye un fragmentu regex que namái casará colos sirvidores de les URLs\n\n#</pre> <!-- dexa<pre> esta llinia exautamente como ta -->",
+ "spam-whitelist": " #<!-- dexa esta llinia exautamente como ta --> <pre>\n# Les URLs esternes d'esta llista *nun* se bloquiarán inda si quedaríen bloquiaes\n# por una entrada na llista negra.\n#\n# La sintaxis ye esta:\n# * Tol testu dende un caráuter \"#\" hasta lo cabero la llinia ye un comentariu\n# * Toa llinia non balera ye un fragmentu regex qu'afeuta namái a les URLs especificaes\n #</pre> <!-- dexa esta llinia exautamente como ta -->",
+ "email-blacklist": " # Los correos que casen con esta llista tendrán torgao rexistrase o unviar corréu.\n # Esta llista afeuta namái a esta wiki; mira tamién la llista negra global.\n # Pa ver la documentación visita https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- dexa esta llinia exautamente como ta --> <pre>\n#\n# La sintaxis ye esta:\n# * Tol testu dende un caráuter \"#\" hasta lo cabero la llinia ye un comentariu\n# * Toa llinia non balera ye un fragmentu regex qu'afeuta namái a los sirvidores de corréu\n\n #</pre> <!-- dexa esta llinia exautamente como ta -->",
+ "email-whitelist": "#<!-- Dexa esta llinia tal y como ta --> <pre>\n# Los correos que casen con esta llista *nun* se bloquiarán, incluío si\n# los hubieren bloquiao entraes de la llista negra.\n#\n #</pre> <!-- Dexa esta llinia tal y como ta -->\n# La sintaxis ye esta:\n# * Tol testu dende un caráuter \"#\" hasta lo cabero la llinia ye un comentariu\n# * Toa llinia non balera ye un fragmentu regex qu'afeuta namái a los sirvidores de corréu",
+ "spam-blacklisted-email": "Corréu electrónicu de la llista negra",
+ "spam-blacklisted-email-text": "El to corréu electrónicu anguaño ta na llista negra y nun pue unviar correos electrónicos a otros usuarios.",
+ "spam-blacklisted-email-signup": "La direición de corréu electrónicu que se dio tien torgáu l'usu por tar anguaño na llista negra.",
+ "spam-invalid-lines": "{{PLURAL:$1|La siguiente llinia|Les siguientes llinies}} de la llista negra de spam {{PLURAL:$1|ye una espresión regular non válida|son espresiones regulares non válides}} y {{PLURAL:$1|necesita ser correxida|necesiten ser correxíes}} enantes de guardar la páxina:",
+ "spam-blacklist-desc": "Ferramienta antispam basada n'espresiones regulares que permite a los usuarios rexistraos poner nuna llista prieta URLs de páxines y direiciones de corréu electrónicu",
+ "log-name-spamblacklist": "Rexistru de la llista prieta de spam",
+ "log-description-spamblacklist": "Estos socesos rexistren les coincidencies cola llista prieta de spam.",
+ "logentry-spamblacklist-hit": "$1 provocó una activación de la llista prieta de spam en $3 al intentar amestar $4.",
+ "right-spamblacklistlog": "Ver el rexistru de la llista prieta de spam",
+ "action-spamblacklistlog": "ver el rexistru de la llista prieta de spam",
+ "apihelp-spamblacklist-description": "Validar una o más URLs escontra SpamBlacklist.",
+ "apihelp-spamblacklist-summary": "Validar una o más URLs escontra SpamBlacklist.",
+ "apihelp-spamblacklist-param-url": "URLs a validar escontra la llista prieta.",
+ "apihelp-spamblacklist-example-1": "Comprobar dos URLs escontra la llista prieta"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/ba.json b/www/wiki/extensions/SpamBlacklist/i18n/ba.json
new file mode 100644
index 00000000..eee870d3
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/ba.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Assele",
+ "Азат Хәлилов",
+ "Янмурза Баки",
+ "Ләйсән"
+ ]
+ },
+ "spam-blacklist": " # Был исемлеккә тап килгән тышҡы һылтанмаларҙы биттәргә өҫтәү тыйыласаҡ.\n # Был исемлек ошо вики өсөн генә ғәмәлгә эйә, шулай уҡ дөйөм ҡара исемлек бар.\n # Тулыраҡ мәғлүмәт өсөн https://www.mediawiki.org/wiki/Extension:SpamBlacklist ҡарағыҙ\n #<!-- был юлды үҙгәртмәгеҙ --><pre>\n#\n# Синтаксис:\n# * # хәрефенән башлап юл аҙағына тиклем барыһы ла иҫкәрмә тип иҫәпләнә\n# * Һәр буш булмаған юл URL эсендәге төйөнгә генә ҡулланылған регуляр аңлатманың өлөшө булып тора\n\n #</pre><!-- был юлды үҙгәртмәгеҙ -->",
+ "spam-whitelist": "#<!-- был юлды нисек бар, шулай ҡалдырығыҙ --> <pre>\n# Был исемлеккә тап килгән тышҡы һылтанмаларҙы биттәргә өҫтәү, хатта улар ҡара исемлектә булһалар ҙа, *тыйылмаясаҡ*.\n#\n# Синтаксис:\n# * # хәрефенән башлап юл аҙағына тиклем барыһы ла иҫкәрмә тип иҫәпләнә\n# * Һәр буш булмаған юл URL эсендәге төйөнгә генә ҡулланылған регуляр аңлатманың өлөшө булып тора\n#</pre> <!-- был юлды нисек бар, шулай ҡалдырығыҙ -->",
+ "spam-blacklisted-email": "Ҡара исемлеккә индерелгән электрон почта адрестары.",
+ "spam-blacklisted-email-text": "Әлеге ваҡытта һеҙҙең электрон почта ҡара исемлектә, шуға күрә һеҙ башҡа ҡулланыусыларға хәбәр ебәрә алмайһығыҙ.",
+ "spam-blacklisted-email-signup": "Күрһәтелгән электрон почта әлеге ваҡытта ҡара исемлектә һәм ҡулланыу мөмкин түгел.",
+ "spam-invalid-lines": "Түбәндәге ҡара исемлек {{PLURAL:$1|1=юлында|юлдарында}} хаталы регуляр {{PLURAL:$1|1=аңлатма|аңлатмалар}} бар, һәм {{PLURAL:$1|1=ул|улар}} битте һаҡлар алдынан төҙәтелергә тейеш:",
+ "spam-blacklist-desc": "Регуляр аңлатмаларға нигеҙләнгән спамға ҡаршы ҡорал ҡара исемлеккә биттәрҙең URL һәм теркәлгән ҡатнашыусыларҙың электрон почта адрестарын ҡуйырға мөмкинлек бирә",
+ "log-name-spamblacklist": "Спам бите журналы.",
+ "log-description-spamblacklist": "Был спам-бит сығыуын күҙәтеүсе журнал.",
+ "logentry-spamblacklist-hit": "$4 өҫтәргә маташыу сәбәбендә $3 биттә {{GENDER:$2|$1}} спам-лист сыға.",
+ "right-spamblacklistlog": "Спам-лист журналын ҡарау.",
+ "action-spamblacklistlog": "Спам-лист журналын ҡарау.",
+ "apihelp-spamblacklist-description": "SpamBlacklist ярҙамында бер йәки бер-нисә URL-адрестарҙы тикшерергә",
+ "apihelp-spamblacklist-param-url": "Ҡара исемлектә тикшерә торған URL-адрестар."
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/bcc.json b/www/wiki/extensions/SpamBlacklist/i18n/bcc.json
new file mode 100644
index 00000000..87b7bd8b
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/bcc.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Mostafadaneshvar",
+ "Baloch Afghanistan"
+ ]
+ },
+ "spam-blacklist": " # از درج پیوندهای بیرونی که با این فهرست مطابقت کنند جلوگیری می‌شود.\n # این فهرست فقط روی همین ویکی اثر دارد؛ به فهرست سیاه سراسری نیز مراجعه کنید.\n # برای مستندات به https://www.mediawiki.org/wiki/Extension:SpamBlacklist مراجعه کنید\n #<!-- این سطر را همان‌گونه که هست رها کنید --> <pre>\n# دستورات به این شکل هستند:\n# * همه چیز از «#» تا پایان سطر به عنوان توضیح در نظر گرفته می‌شود\n# * هر سطر از متن به عنوان یک دستور از نوع عبارت باقاعده در نظر گرفته می‌شود که فقط با نام میزبان در نشانی اینترنتی مطابقت داده می‌شود\n\n #</pre> <!-- این سطر را همان‌گونه که هست رها کنید -->",
+ "spam-blacklist-desc": "وسیله په ضد اسپم په اساس عبارات منظم: [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/bcl.json b/www/wiki/extensions/SpamBlacklist/i18n/bcl.json
new file mode 100644
index 00000000..38fdb26a
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/bcl.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Geopoet"
+ ]
+ },
+ "spam-blacklist": "#</pre><!-- pakiwalat ining linya na eksaktong siring kaiyan -->\n# Mga panluwas na pangilyaw na minatampad kaining listahan ipagkukubkob kunsoarin na ipagdugang ini sa sarong pahina.\n# Ining listahan mina-apekto sana sa wiking ini; pakihiling man sa pankinabanong pinagbaraduhan.\n# Para sa dokumentasyon hilngon tabi sa https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n# \n#An sintaks iyo an mga minasunod:\n# *An gabos magpoon sa \"#\" na karakter sagkod sa tapos kan linya iyo an komento\n# *An lambang bako na blankong linya iyo an sarong kapedasohan kan regex na makakapagtampad sana kan mga parabunsod na yaon sa laog kan mga pangilyaw\n\n#</pre><!-- pakiwalat ining linya na eksaktong siring kaiyan -->",
+ "spam-whitelist": "#<!-- pakiwalat ining linya na eksaktong siring kaiyan --> <pre>\n#An panluwas na mga pangilyaw na nagtatampad kaining listahn *dae* ipagkukubkob dawa ngani na sinda #ipinagkubkob kan mga pinagbarahang entrada.\n#\n#An sintaks iyo an mga minasunod:\n# *An gabos magpoon sa \"#\" na karakter sagkod sa tapos kan linya iyo an komento\n# *An lambang bako na blankong linya iyo an sarong kapedasohan kan regex na makakapagtampad sana kan mga parabunsod na yaon sa laog kan mga pangilyaw\n\n#</pre><!-- pakiwalat ining linya na eksaktong siring kaiyan -->",
+ "email-blacklist": "#<!-- pakiwalat ining linya na eksaktong siring kaiyan --> <pre>\n#An mga e-surat na nagtatampad kaining listahan ipagkukubkob sa pagpaparehistro o sa pagpapadara kan me e-surat\n#Ining listahan mina-apekto sana kaining wiki; pakihiling man sa pankinabanong pinagbarahan.\n#Para sa dokumentasyon pakihiling sa https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n#An sintaks iyo an mga minasunod:\n# *An gabos magpoon sa \"#\" na karakter sagkod sa tapos kan linya iyo an komento\n# *An lambang bako na blankong linya iyo an sarong kapedasohan kan regex na makakapagtampad sana kan mga parabunsod na yaon sa laog kan mga estada kan e-surat\n\n#</pre><!-- pakiwalat ining linya na eksaktong siring kaiyan -->",
+ "email-whitelist": "#<!-- pakiwalat ining linya na eksaktong siring kaiyan --> <pre>\n#An mga e-surat na nagtatampad kaining listahan *dae* ipagkukubkob dawa ngani sinda\n#pinagkubkob kan mga pingbarahang entrada.\n#\n#An sintaks iyo an mga minasunod:\n# *An gabos magpoon sa \"#\" na karakter sagkod sa tapos kan linya iyo an komento\n# *An lambang bako na blankong linya iyo an sarong kapedasohan kan regex na makakapagtampad sana kan mga parabunsod na yaon sa laog kan mga estada kan e-surat\n\n#</pre><!-- pakiwalat ining linya na eksaktong siring kaiyan -->",
+ "spam-blacklisted-email": "Pinagbaraduhang estada kan e-surat",
+ "spam-blacklisted-email-text": "An saimong estada kan e-surat sa ngunyan pinagbaraduhan sa pagpapadara nin mga e-surat pasiring sa ibang mga paragamit.",
+ "spam-blacklisted-email-signup": "An ipinagtaong estada kan e-surat sa ngunyan pinagbaraduhan na magamit.",
+ "spam-invalid-lines": "An minasunod na pinagbarahang listahan kan espam {{PLURAL:$1|hilira iyo an|hilira iyo an mga}} imbalidong pirmihan na {{PLURAL:$1|ekspresyon|mga ekspresyon}} asin {{PLURAL:$1|kinakaipuhan|kaipuhan}} na pagkokorihiran bago tabi itatagama an pahina:",
+ "spam-blacklist-desc": "Nakabase sa Regex na gamit sa anti-espam:[[MediaWiki:Spam-blacklist]] asin [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/be-tarask.json b/www/wiki/extensions/SpamBlacklist/i18n/be-tarask.json
new file mode 100644
index 00000000..ba284c35
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/be-tarask.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "EugeneZelenko",
+ "Jim-by",
+ "Red Winged Duck"
+ ]
+ },
+ "spam-blacklist": " # Вонкавыя спасылкі, якія будуць адпавядаць гэтаму сьпісу, будуць блякавацца пры \n # спробе даданьня на старонку.\n # Гэты сьпіс будзе дзейнічаць толькі ў гэтай вікі; існуе таксама і глябальны чорны сьпіс.\n # Дакумэнтацыю гэтай функцыі глядзіце на https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- пакіньце гэты радок такім, які ён ёсьць --> <pre>\n#\n# Сынтаксіс наступны:\n# * Усё, што пачынаецца з «#» і да канца радку, зьяўляецца камэнтарам\n# * Усе непустыя радкі зьяўляюцца часткамі рэгулярнага выразу, які будзе выкарыстоўвацца толькі\n# ў дачыненьні да назваў сэрвэраў у вонкавых спасылках\n\n #</pre> <!-- пакіньце гэты радок такім, які ён ёсьць -->",
+ "spam-whitelist": " #<!-- пакіньце гэты радок такім, які ён ёсьць --> <pre>\n# Вонкавыя спасылкі, якія будуць адпавядаць гэтаму сьпісу, *ня* будуць блякавацца, нават калі яны \n# будуць адпавядаць чорнаму сьпісу\n#\n# Сынтаксіс наступны:\n# * Усё, што пачынаецца з «#» і да канца радка, зьяўляецца камэнтарам\n# * Усе непустыя радкі зьяўляюцца часткамі рэгулярнага выразу, які будзе выкарыстоўвацца толькі\n# ў дачыненьні да назваў сэрвэраў у вонкавых спасылках\n\n #</pre> <!-- пакіньце гэты радок такім, які ён ёсьць -->",
+ "email-blacklist": " # Электронныя лісты, якія будуць адпавядаць гэтаму сьпісу, будуць блякавацца пры \n # спробе адпраўкі.\n # Гэты сьпіс будзе дзейнічаць толькі ў гэтай вікі; існуе таксама і глябальны чорны сьпіс.\n # Дакумэнтацыю гэтай функцыі глядзіце на https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- пакіньце гэты радок такім, які ён ёсьць --> <pre>\n#\n# Сынтаксіс наступны:\n# * Усё, што пачынаецца з «#» і да канца радку, зьяўляецца камэнтарам\n# * Усе непустыя радкі зьяўляюцца часткамі рэгулярнага выразу, які будзе выкарыстоўвацца толькі\n# ў дачыненьні да назваў сэрвэраў у электронных лістах\n\n #</pre> <!-- пакіньце гэты радок такім, які ён ёсьць -->",
+ "email-whitelist": " #<!-- пакіньце гэты радок такім, які ён ёсьць --> <pre>\n # Электронныя лісты, якія будуць адпавядаць гэтаму сьпісу, ня будуць блякавацца, нават \n # калі яны будуць у чорным сьпісе. \n #\n #</pre> <!-- пакіньце гэты радок такім, які ён ёсьць -->\n# Сынтаксіс наступны:\n# * Усё, што пачынаецца з «#» і да канца радку, зьяўляецца камэнтарам\n# * Усе непустыя радкі зьяўляюцца часткамі рэгулярнага выразу, які будзе выкарыстоўвацца толькі\n# ў дачыненьні да назваў сэрвэраў у электронных лістах",
+ "spam-blacklisted-email": "Адрасы электроннай пошты з чорнага сьпісу",
+ "spam-blacklisted-email-text": "З Вашага адрасу электроннай пошты ў цяперашні момант забаронена дасылаць электронныя лісты іншым удзельнікам.",
+ "spam-blacklisted-email-signup": "Пададзены Вамі адрас электроннай пошты ў цяперашні момант знаходзіцца ў чорным сьпісе.",
+ "spam-invalid-lines": "{{PLURAL:$1|1=Наступны радок чорнага сьпісу ўтрымлівае няслушны рэгулярны выраз|Наступныя радкі чорнага сьпісу ўтрымліваюць няслушныя рэгулярныя выразы}} і {{PLURAL:$1|1=павінен быць|павінныя быць}} выпраўлены перад захаваньнем старонкі:",
+ "spam-blacklist-desc": "Антыспамавы інструмэнт, які базуецца на рэгулярных выразах, дазваляе дадаваць у чорны сьпіс URL-адрасы на старонках і адрасы электроннай пошты для зарэгістраваных удзельнікаў",
+ "log-name-spamblacklist": "Журнал спам-сьпісу",
+ "right-spamblacklistlog": "прагляд журнала спам-сьпісу"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/bg.json b/www/wiki/extensions/SpamBlacklist/i18n/bg.json
new file mode 100644
index 00000000..d29d29b2
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/bg.json
@@ -0,0 +1,15 @@
+{
+ "@metadata": {
+ "authors": [
+ "Spiritia",
+ "Borislav",
+ "ShockD",
+ "StanProg"
+ ]
+ },
+ "spam-invalid-lines": "{{PLURAL:$1|Следният запис|Следните записи}} от черния списък на спама {{PLURAL:$1|е невалиден регулярен израз|са невалидни регулярни изрази}} и трябва да {{PLURAL:$1|бъде коригиран|бъдат коригирани}} преди съхраняване на страницата:",
+ "spam-blacklist-desc": "Инструмент за защита от спам, използващ регулярни изрази и позволяващ добавяне в черен списък на страници и имейл адреси, достъпен за регистрирани потребители",
+ "log-name-spamblacklist": "Дневник на черния списък против спам",
+ "log-description-spamblacklist": "Тези събития следят съвпаденията с черния списък против спам.",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}} предизвика съвпадение с черния списък против спам в $3, опитвайки се да добави $4."
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/bjn.json b/www/wiki/extensions/SpamBlacklist/i18n/bjn.json
new file mode 100644
index 00000000..e881d46e
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/bjn.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Alamnirvana"
+ ]
+ },
+ "spam-invalid-lines": "Baris-baris nang maumpati ini manggunaakan ungkapan nalar nang kahada sah. Silakan dibaiki daptar hirang ini sabalum manyimpannya:"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/bn.json b/www/wiki/extensions/SpamBlacklist/i18n/bn.json
new file mode 100644
index 00000000..9f8b8ead
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/bn.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Aftab1995",
+ "Bellayet",
+ "Nasir8891",
+ "Zaheen",
+ "Aftabuzzaman"
+ ]
+ },
+ "spam-blacklist": "#<!-- এই লাইন যেমন আছে ঠিক তেমনই রেখে দিন --> <pre>\n# যখন একটি পৃষ্ঠায় যোগ করা তখন এই তালিকার সাথে মেলা বাহ্যিক URL গুলি বাধাদান করা হবে।\n# এই তালিকা শুধুমাত্র এই উইকিতে প্রভাব ফেলবে; এছাড়াও বিশ্বব্যাপী কালোতালিকাও দেখুন।\n# নথির জন্য দেখুন https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# সিনট্যাক্স নিচের মত:\n# * \"#\" ক্যারেক্টার থেকে শুরু করে লাইনের শেষ পর্যন্ত সবকিছু একটি মন্তব্য\n# * প্রতিটি অশূন্য লাইন একটি রেজেক্স খণ্ডাংশ যেটি শুধুমাত্র URL গুলির ভিতরে হোস্ট মিলিয়ে দেখবে\n\n #</pre> <!-- এই লাইন যেমন আছে ঠিক তেমনই রেখে দিন -->",
+ "spam-whitelist": " #<!-- এই লাইন যেমন আছে ঠিক তেমনই রেখে দিন --> <pre>\n# External URLs matching this list will *not* be blocked even if they would\n# have been blocked by blacklist entries.\n#\n# Syntax is as follows:\n# * Everything from a \"#\" character to the end of the line is a comment\n# * Every non-blank line is a regex fragment which will only match hosts inside URLs\n\n #</pre> <!-- এই লাইন যেমন আছে ঠিক তেমনই রেখে দিন -->",
+ "spam-blacklisted-email": "কালোতালিকাভুক্ত ইমেইল ঠিকানা",
+ "spam-blacklisted-email-text": "অন্যদের ইমেইল পাঠানো থেকে বিরত রাখতে আপনাকে কালোতালিকাভুক্ত করা হয়েছে।",
+ "spam-blacklisted-email-signup": "আপনার লেখা ইমেইল ঠিকানাটি কালোতালিকাভুক্ত।",
+ "spam-invalid-lines": "নিচের স্প্যাম কালোতালিকার {{PLURAL:$1|লাইন|লাইনগুলি}} অবৈধ রেগুলার {{PLURAL:$1|এক্সপ্রেশন|এক্সপ্রেশন}} ধারণ করছে এবং পাতাটি সংরক্ষণের আগে এগুলি ঠিক করা {{PLURAL:$1|প্রয়োজন|প্রয়োজন}}:",
+ "spam-blacklist-desc": "রেজেক্স-ভিত্তিক স্প্যামরোধী সরঞ্জাম: [[MediaWiki:Spam-blacklist]] এবং [[MediaWiki:Spam-whitelist]]",
+ "log-name-spamblacklist": "স্প্যাম কালোতালিকা লগ",
+ "log-description-spamblacklist": "এই ঘটনাগুলি স্প্যাম কালোতালিকার হিট অনুসরণ।",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}} $4 যোগ করতে যেয়ে $3-এ একটি স্প্যাম কালোতালিকা সক্রিয় করেছেন।",
+ "right-spamblacklistlog": "স্প্যাম কালোতালিকা লগ দেখুন",
+ "action-spamblacklistlog": "স্প্যাম কালোতালিকা লগ দেখুন"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/bo.json b/www/wiki/extensions/SpamBlacklist/i18n/bo.json
new file mode 100644
index 00000000..cb2cbadc
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/bo.json
@@ -0,0 +1,7 @@
+{
+ "@metadata": {
+ "authors": [
+ "Phurbutsering"
+ ]
+ }
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/br.json b/www/wiki/extensions/SpamBlacklist/i18n/br.json
new file mode 100644
index 00000000..8cf336e0
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/br.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "Fulup",
+ "Zoranzoki21"
+ ]
+ },
+ "spam-blacklist": " # Stanket e vo an URLoù diavaez a glot gant ar roll-mañ ma vezont ouzhpennet en ur bajenn.\n # Ne sell ar roll-mañ nemet ouzh ar wiki-mañ ; sellit ivez ouzh al listenn zu hollek.\n # Aze emañ an titouroù https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- leave this line exactly as it is --> <pre>\n#\n# Setu doare an ereadur :\n# * Pep tra adalek un arouezenn \"#\" betek dibenn al linenn zo un evezhiadenn\n# * Kement linenn anc'houllo zo un darnad lavarenn reoliek na gloto nemet gant an ostizien el liammoù gourskrid\n\n #</pre> <!-- lezel al linenn-mañ tre evel m'emañ -->",
+ "spam-whitelist": " #<!-- lezel al linenn-mañ tre evel m'emañ --> <pre>\n# *Ne vo ket* stanket al liammoù gourskrid a glot gant al listenn-mañ\n# ha pa vijent bet stanket gant monedoù ar listenn zu.\n#\n# Setu an eredur :\n# * Pep tra adalek un arouezenn \"#\" betek dibenn al linenn zo un ev evezhiadenn\n# * Kement linenn anc'houllo zo un darnad skrid poellek na zielfennno nemet an ostizien el liammoù gourskrid\n\n #</pre> <!-- lezel al linenn-mañ tre evel m'emañ -->",
+ "email-blacklist": " # Miret e vo ouzh ar chomlec'hioù postel a glot gant ar roll-mañ da enrollañ pe da gas posteloù\n # Ne sell ar roll-mañ nemet ouzh ar wiki-mañ ; sellit ivez ouzh al listenn zu hollek.\n # Aze emañ an titouroù https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- lezel al linenn-mañ tre evel m'emañ --> <pre>\n#\n# Setu doare an ereadur :\n# * Kement testenn zo war-lerc'h un arouezenn \"#\" betek dibenn al linenn a vez sellet outi evel un evezhiadenn\n# * Kement linenn n'eo ket goullo zo un tamm eus ul lavarenn reoliek na gloto nemet gant an ostizien el liammoù gourskrid\n\n #</pre> <!-- lezel al linenn-mañ tre evel m'emañ -->",
+ "email-whitelist": " #<!-- lezel al linenn-mañ tre evel m'emañ --> <pre>\n# *Ne vo ket* stanket ar chomlec'hioù postel zo er roll-mañ ha pa oant da vezañ\n# diouzh enmontoù al listenn zu.\n#\n #</pre> <!-- lezel al linenn-mañ tre evel m'emañ -->\n# Setu an ereadur :\n# * Kement tra zo war-lerc'h un arouezenn \"#\" betek dibenn al linenn zo un evezhiadenn\n# * Kement linenn n'eo ket goullo zo un tamm regex (lavarenn reoliek) a vo lakaet a-geñver gant al lodenn \"ostiz\" e diabarzh ar chomlec'hioù postel",
+ "spam-blacklisted-email": "Chomlec'hioù postel ha listenn zu",
+ "spam-blacklisted-email-text": "Evit ar mare emañ ho chomlec'h postel war ul listenn zu ha n'haller ket kas posteloù drezañ d'an implijerien all.",
+ "spam-blacklisted-email-signup": "War ul listenn zu emañ ar chomlec'h postel pourchaset. N'hall ket bezañ implijet.",
+ "spam-invalid-lines": "{{PLURAL:$1|Ul lavarenn|Lavarennoù}} reoliek direizh eo {{PLURAL:$1|al linenn|al linennoù}} da-heul eus roll du ar stroboù ha ret eo {{PLURAL:$1|he reizhañ|o reizhañ}} a-raok enrollañ ar bajenn :",
+ "spam-blacklist-desc": "Ostilh enep-strob diazezet war lavarennoù reoliek (Regex) : [[MediaWiki:Spam-blacklist]] ha [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/bs.json b/www/wiki/extensions/SpamBlacklist/i18n/bs.json
new file mode 100644
index 00000000..42675cda
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/bs.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "CERminator",
+ "KWiki",
+ "Srdjan m"
+ ]
+ },
+ "spam-blacklist": "# Vanjski URLovi koji odgovaraju ovom spisku će biti blokirani ako se dodaju na stranicu.\n # Ovaj spisak će biti aktivan samo na ovoj wiki; a poziva se i na globalni zabranjeni spisak.\n # Za objašenjenja i dokumentaciju pogledajte https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- ostavite ovaj red tačno onako kakav je --> <pre>\n#\n# Sintaksa je slijedeća:\n# * Sve od znaka \"#\" do kraja reda je komentar\n# * Svi neprazni redovi su fragmenti regexa koji će odgovarati samo domaćinima unutar URLova\n\n #</pre> <!-- ostavite ovaj red tačno onako kakav je -->",
+ "spam-whitelist": "#<!-- ostavite ovaj red onakav kakav je --> <pre>\n# Vanjski URLovi koji odgovaraju nekoj od stavki na ovom spisku *neće* biti blokirani čak iako\n# budu blokirani preko spisak nepoželjnih stavki.\n#\n# Sintaksa je slijedeća:\n# * Sve od znaka \"#\" do kraja reda je komentar\n# * Svaki neprazni red je fragment regexa koji će odgovarati samo domaćinima unutar URLa\n\n #</pre> <!-- ostavite ovaj red onakav kakav je -->",
+ "spam-invalid-lines": "Sljedeći {{PLURAL:$1|red|redovi}} u spisku nepoželjnih spam-stavki {{PLURAL:$1|je nevalidan izraz|su nevalidni izrazi}} i {{PLURAL:$1|treba|trebaju}} se ispraviti prije spašavanja stranice:",
+ "spam-blacklist-desc": "Alat protiv neželjenog sadržaja zasnovan na regularnim izrazima omogućava zabranu URL-ova na stranicama i adresa e-pošte registriranim korisnicima",
+ "log-name-spamblacklist": "Zapisnik crne liste neželjenog sadržaja",
+ "logentry-spamblacklist-hit": "$1 {{GENDER:$2|aktivirao|aktivirala}} je unos na crnoj listi na stranici $3 pokušavajući dodati $4.",
+ "right-spamblacklistlog": "Pregledanje zapisnika crne liste neželjenog sadržaja",
+ "action-spamblacklistlog": "pregledate zapisnik crne liste neželjenog sadržaja"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/ca.json b/www/wiki/extensions/SpamBlacklist/i18n/ca.json
new file mode 100644
index 00000000..8313457f
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/ca.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": [
+ "Aleator",
+ "Arnaugir",
+ "Jordi Roqué",
+ "SMP",
+ "Vriullop",
+ "Ssola"
+ ]
+ },
+ "spam-blacklist": " #<!-- deixeu aquesta línia exactament com està --> <pre>\n# Les URLs externes coincidents amb aquesta llista seran blocades en ser afegides a una pàgina.\n# Aquesta llista afecta només aquesta wiki; vegeu també la llista negra global.\n# Per a més informació vegeu https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# La sintaxi és com segueix:\n# * Tot allò des d'un caràcter \"#\" fins al final de la línia és un comentari\n# * Cada línia que no estigui en blanc és un fragment regex que només coincidirà amb amfitrions dintre d'URLs\n\n #</pre> <!-- deixeu aquesta línia exactament com està -->",
+ "spam-whitelist": " #<!-- deixeu aquesta línia tal com està --> <pre>\n# Les adreces URL externes que apareguin en aquesta llista no seran blocades\n# fins i tot si haurien estat blocades per aparèixer a la llista negra.\n#\n# La sintaxi és la següent:\n# * Tot allò que hi hagi des d'un símbol '#' fins a la fi de línia és un comentari\n# * Cada línia no buida és un fragment d'expressió regular (regex) que només marcarà hosts dins les URL\n\n #</pre> <!-- deixeu aquesta línia tal com està -->",
+ "spam-blacklisted-email": "Adreces de correu electrònic a la llista negra",
+ "spam-blacklisted-email-text": "La vostra adreça de correu electrònic està actualment en la llista negra d'enviament de correus a altres usuaris.",
+ "spam-blacklisted-email-signup": "L'adreça de correu electrònic proporcionada està actualment en la llista negra d'ús.",
+ "spam-invalid-lines": "{{PLURAL:$1|La línia següent no es considera una expressió correcta|Les línies següents no es consideren expressions correctes}} {{PLURAL:$1|perquè recull|perquè recullen}} SPAM que està vetat. Heu d'esmenar-ho abans de salvar la pàgina:",
+ "spam-blacklist-desc": "Eina anti-spam basada en regexp: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/ce.json b/www/wiki/extensions/SpamBlacklist/i18n/ce.json
new file mode 100644
index 00000000..9840fe56
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/ce.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Умар"
+ ]
+ },
+ "spam-blacklist-desc": "Анти-спам гӀирс URL дӀакъовла таро хуьлуьйту агӀонашкахь а, электронан почтехь а дӀабазбелачу декъашхошна",
+ "log-name-spamblacklist": "Спам-кехатан тептар",
+ "log-description-spamblacklist": "Спам-кехато зулам долоре хьожу тептар."
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/ckb.json b/www/wiki/extensions/SpamBlacklist/i18n/ckb.json
new file mode 100644
index 00000000..1ade6a54
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/ckb.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Calak"
+ ]
+ },
+ "right-spamblacklistlog": "دیتنی لۆگی پێرستی ڕەشی ڕیکلام"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/cs.json b/www/wiki/extensions/SpamBlacklist/i18n/cs.json
new file mode 100644
index 00000000..6ddc41e9
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/cs.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Li-sung",
+ "Matěj Grabovský",
+ "Mormegil"
+ ]
+ },
+ "spam-blacklist": " # Externí URL odpovídající tomuto seznamu budou zablokovány při pokusu přidat je na stránku.\n # Tento seznam ovlivňuje jen tuto wiki; podívejte se také na globální černou listinu.\n # Dokumentaci najdete na https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- Nechte tento řádek přesně tak jak je --> <pre>\n#\n# Syntaxe je následující:\n# * Všechno od znaku „#“ do konce řádku je komentář\n# * Každý neprázdný řádek je část regulárního výrazu, kterému budou odpovídat pouze domény z URL\n\n #</pre> <!-- Nechte tento řádek přesně tak jak je -->",
+ "spam-whitelist": " #<!-- nechejte tento řádek přesně tak jak je --> <pre>\n# Externí URL odpovídající výrazům v tomto seznamu *nebudou* zablokovány, ani kdyby\n# je zablokovaly položky z černé listiny.\n#\n# Syntaxe je následující:\n# * Všechno od znaku „#“ do konce řádku je komentář\n# * Každý neprázdný řádek je část regulárního výrazu, kterému budou odpovídat pouze domény z URL\n\n #</pre> <!-- nechejte tento řádek přesně tak jak je -->",
+ "email-blacklist": " # Z e-mailů vyhovujících tomuto seznamu nebude možno zaregistrovat účet ani odesílat e-mail.\n # Tento seznam ovlivňuje jen tuto wiki; vizte také globální černou listinu.\n # Dokumentaci najdete na https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- tuto řádku ponechte přesně tak, jak je --> <pre>\n#\n# Syntaxe je následující:\n# * Všechno od znaku „#“ do konce řádku je komentář\n# * Každý neprázdný řádek je část regulárního výrazu, kterému budou odpovídat pouze domény v e-mailových adresách\n\n #</pre> <!-- tuto řádku ponechte přesně tak, jak je -->",
+ "email-whitelist": " #<!-- tuto řádku ponechte přesně tak, jak je --> <pre>\n# E-maily vyhovující tomuto seznamu *nebudou* blokovány, i kdyby\n# odpovídaly záznamům v černé listině.\n#\n# Syntaxe je následující:\n# * Všechno od znaku „#“ do konce řádku je komentář\n# * Každý neprázdný řádek je část regulárního výrazu, kterému budou odpovídat pouze domény v e-mailových adresách\n #</pre> <!-- tuto řádku ponechte přesně tak, jak je -->",
+ "spam-blacklisted-email": "E-mail na černé listině",
+ "spam-blacklisted-email-text": "Vaše e-mailová adresa je momentálně uvedena na černé listině, takže ostatním uživatelům nemůžete posílat e-maily.",
+ "spam-blacklisted-email-signup": "Uvedená e-mailová adresa je v současné době na černé listině.",
+ "spam-invalid-lines": "Na černé listině spamu {{PLURAL:$1|je následující řádka neplatný regulární výraz|jsou následující řádky neplatné regulární výrazy|jsou následující řádky regulární výrazy}} a je nutné {{PLURAL:$1|ji|je|je}} před uložením stránky opravit :",
+ "spam-blacklist-desc": "Antispamový nástroj na základě regulárních výrazů umožňující zakázat URL ve stránkách a e-mailových adresách registrovaných uživatelů",
+ "log-name-spamblacklist": "Kniha protispamové černé listiny",
+ "log-description-spamblacklist": "Tyto události sledují zásahy protispamové černé listiny.",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|Uživateli|Uživatelce}} $1 zabránila protispamová černá listina přidat $4 na stránku $3.",
+ "right-spamblacklistlog": "Prohlížení knihy protispamové černé listiny",
+ "action-spamblacklistlog": "prohlížet knihu protispamové černé listiny"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/cy.json b/www/wiki/extensions/SpamBlacklist/i18n/cy.json
new file mode 100644
index 00000000..d834c466
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/cy.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Lloffiwr",
+ "Xxglennxx"
+ ]
+ },
+ "spam-blacklist": "# Dyma restr o gyfeiriadau URL allanol; os osodir un o'r rhain ar dudalen fe gaiff ei flocio.\n # Ar gyfer y wici hwn yn unig mae'r rhestr hon; mae rhestr waharddedig led-led yr holl wicïau i'w gael.\n # Gweler https://www.mediawiki.org/wiki/Extension:SpamBlacklist am ragor o wybodaeth.\n #<!-- leave this line exactly as it is --> <pre>\n#\n# Dyma'r gystrawen:\n# * Mae popeth o nod \"#\" hyd at ddiwedd y llinell yn sylwad\n# * Mae pob llinell nad yw'n wag yn ddarn regex sydd ddim ond yn cydweddu \n# * gwesteiwyr tu mewn i gyfeiriadau URL\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# *Ni fydd* cyfeiriadau URL allanol sydd ar y rhestr hon yn cael eu blocio\n# hyd yn oed pan ydynt ar restr arall o gyfeiriadau URL gwaharaddedig.\n#\n# Dyma'r gystrawen:\n# * Mae popeth o nod \"#\" hyd at ddiwedd y llinell yn sylwad\n# * Mae pob llinell nad yw'n wag yn ddarn regex sydd ddim ond yn cydweddu \n# * gwesteiwyr tu mewn i gyfeiriadau URL\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "email-blacklist": "#<!-- leave this line exactly as it is --> <pre>\n# Fe gaiff cyfeiriadau ebost sydd yn cyfateb i'r rhestr hon eu blocio rhag iddynt gofrestru neu anfon ebyst\n# Ar gyfer y wici hwn yn unig mae'r rhestr hon; mae rhestr waharddedig led-led yr holl wicïau i'w gael.\n# Gweler https://www.mediawiki.org/wiki/Extension:SpamBlacklist am ragor o wybodaeth.\n#\n# Dyma'r gystrawen:\n# * Mae popeth o nod \"#\" hyd at ddiwedd y llinell yn sylwad\n# * Mae pob llinell nad yw'n wag yn ddarn regex sydd ddim ond yn cydweddu gwesteiwyr tu mewn i gyfeiriadau ebost\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "email-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# *Ni fydd* cyfeiriadau ebost sydd ar y rhestr hon yn cael eu blocio\n# hyd yn oed pan ydynt ar restr arall o gyfeiriadau ebost gwaharaddedig.\n#\n# Dyma'r gystrawen:\n# * Mae popeth o nod \"#\" hyd at ddiwedd y llinell yn sylwad\n# * Mae pob llinell nad yw'n wag yn ddarn regex sydd ddim ond yn cydweddu \n# * gwesteiwyr tu mewn i gyfeiriadau ebost\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-blacklisted-email": "Cyfeiriad ebost ar y rhestr waharddedig",
+ "spam-blacklisted-email-text": "Mae eich cyfeiriad ebost wedi ei wahardd rhag anfon ebyst at ddefnyddwyr eraill ar hyn o bryd.",
+ "spam-blacklisted-email-signup": "Mae'r cyfeiriad ebost a roddwyd wedi ei wahardd rhag ei ddefnyddio ar hyn o bryd.",
+ "spam-invalid-lines": "Mae'r {{PLURAL:$1|llinell|llinell|llinellau}} canlynol ar y rhestr spam gwaharddedig yn {{PLURAL:$1|fynegiad|fynegiad|fynegiadau}} rheolaidd annilys; rhaid {{PLURAL:ei gywiro|ei gywiro|eu cywiro}} cyn rhoi'r dudalen ar gadw:",
+ "spam-blacklist-desc": "Teclyn gwrth-sbam yn seiliedig ar regex, sy'n galluogi gwahardd y canlynol - URLs o fewn tudalennau a chyfeiriadau ebost defnyddwyr cofrestredig",
+ "log-name-spamblacklist": "Lòg y rhestr sbam waharddedig",
+ "log-description-spamblacklist": "Mae'r digwyddiadau hyn yn cofnodi trawiadau ar y rhestr sbam waharddedig.",
+ "logentry-spamblacklist-hit": "Fe geisiodd $1 ychwanegu $4 sydd ar y rhestr waharddedig $3.",
+ "right-spamblacklistlog": "Gallu gweld lòg y rhestr sbam waharddedig",
+ "action-spamblacklistlog": "gweld lòg rhestr y sbam gwaharddedig"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/da.json b/www/wiki/extensions/SpamBlacklist/i18n/da.json
new file mode 100644
index 00000000..6ad896f6
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/da.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Christian List",
+ "HenrikKbh",
+ "Hylle"
+ ]
+ },
+ "spam-blacklist": "#<!-- lad denne linje være nøjagtig som den er --> <pre>\n # Denne liste blokerer matchende eksterne URL'er matching fra at blive tilføjet siden.\n # denne liste berører kun denne wiki; henviser også til den globale sortliste.\n # For dokumentation se https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# syntaksen er som følger:\n # * alt fra et \"#\" tegn til slutningen af linjen er en kommentar\n # * hver ikke-tomme linjer anvendes som regulære udtryk for at matcha domænenavne i webadresser\n #</pre> <!-- lad denne linje være nøjagtig som den er -->",
+ "spam-whitelist": "#<!-- lad denne linje være nøjagtig som den er --> <pre>\n# Eksterne URL'er på denne liste bliver ikke blokeret, selvom de ville være blevet det gennem den globale sortliste.\n# For dokumentation se https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# Syntaksen er som følger:\n# * alt fra et \"#\" tegn til slutningen af linjen er en kommentar\n# * hver ikke-tomme linjer anvendes som regulære udtryk for at matcha domænenavne i webadresser\n#</pre> <!-- lad denne linje være nøjagtig som den er -->",
+ "email-blacklist": "#<!-- lad denne linje være nøjagtig som den er --> <pre>\n# E-mail adresser der er på denne liste vil blive blokeret fra at registreres eller fra at sende e-mails\n# Denne liste vedrører kun denne wiki; se også den globale sortliste\n# For dokumentation se https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# Syntaksen er som følger:\n# * alt fra et \"#\" tegn til slutningen af linjen er en kommentar\n# * hver ikke-tomme linjer anvendes som regulære udtryk for at matche domænenavne i webadresser\n#</pre> <!-- lad denne linje være nøjagtig som den er -->",
+ "email-whitelist": "#<!-- lad denne linje være nøjagtig som den er --> <pre>\n# E-mail adresser på denne liste bliver ikke blokeret, selvom de ville være blevet det gennem den globale sortliste.\n#\n# Syntaksen er som følger:\n# * alt fra et \"#\" tegn til slutningen af linjen er en kommentar\n# * hver ikke-tomme linjer anvendes som regulære udtryk for at matcha domænenavne i webadresser\n#</pre> <!-- lad denne linje være nøjagtig som den er -->",
+ "spam-blacklisted-email": "Sortlistet e-mailadresse",
+ "spam-blacklisted-email-text": "Din e-mailadresse er i øjeblikket blokeret fra at sende e-mails til andre brugere.",
+ "spam-blacklisted-email-signup": "Den angivne e-mailadresse er i øjeblikket blokeret for brug.",
+ "spam-invalid-lines": "Følgende {{PLURAL:$1|linje|linjer}} i spamsortelisten er {{PLURAL:$1|et ugyldigt regulært udtryk|ugyldige regulære udtryk}} og må rettes før lagring af siden:",
+ "spam-blacklist-desc": "Antispamværktøj baseret på regulære udtryk der giver mulighed for at sortliste URLs i sider og e-mailadresser for registrerede brugere",
+ "log-name-spamblacklist": "Spamsortlistningslog",
+ "log-description-spamblacklist": "Disse begivenheder er træfferer i spamsortlistningen.",
+ "logentry-spamblacklist-hit": "$1 ramte en regel i spamsortlisten på $3 ved at forsøge at tilføje $4.",
+ "right-spamblacklistlog": "Vis spamsortlisteloggen",
+ "action-spamblacklistlog": "se spamsortlisteloggen"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/de-ch.json b/www/wiki/extensions/SpamBlacklist/i18n/de-ch.json
new file mode 100644
index 00000000..0cfb0e70
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/de-ch.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Geitost"
+ ]
+ },
+ "email-blacklist": " #<!-- Diese Zeile darf nicht verändert werden! --> <pre>\n # E-Mail-Adressen, die in dieser Liste enthalten sind, werden bei der Registrierung sowie beim Senden von E-Mail-Nachrichten geblockt.\n # Diese Liste hat nur Auswirkungen auf dieses Wiki. Siehe gegebenenfalls auch die globale Blockierliste.\n # Zur Dokumentation dieser Funktion siehe auch https://www.mediawiki.org/wiki/Extension:SpamBlacklist.\n#\n# Syntax wie folgt:\n# * Alles ab dem «#»-Zeichen bis zum Ende der Zeile ist ein Kommentar.\n# * Jede nicht-leere Zeile ist ein regulärer Ausdruck, der gegen die Host-Namen in den E-Mail-Adressen abgeglichen wird.\n\n #</pre> <!-- Diese Zeile darf nicht verändert werden! -->"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/de-formal.json b/www/wiki/extensions/SpamBlacklist/i18n/de-formal.json
new file mode 100644
index 00000000..cd3dd3c4
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/de-formal.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kghbln"
+ ]
+ },
+ "spam-blacklisted-email-text": "Ihre E-Mail-Adresse ist derzeit für das Senden von E-Mail-Nachrichten an andere Benutzer blockiert."
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/de.json b/www/wiki/extensions/SpamBlacklist/i18n/de.json
new file mode 100644
index 00000000..fbe56de3
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/de.json
@@ -0,0 +1,32 @@
+{
+ "@metadata": {
+ "authors": [
+ "Geitost",
+ "Kghbln",
+ "Metalhead64",
+ "Raimond Spekking",
+ "S2cchst",
+ "Umherirrender",
+ "Wnme",
+ "Debenben"
+ ]
+ },
+ "spam-blacklist": " # Externe URLs, die in dieser Liste enthalten sind, blockieren das Speichern einer Seite.\n # Diese Liste hat nur Auswirkungen auf dieses Wiki. Siehe ggf. auch die globale Blockierliste.\n # Siehe auch https://www.mediawiki.org/wiki/Extension:SpamBlacklist für die Dokumentation dieser Funktion. \n #<!-- Diese Zeile darf nicht verändert werden! --> <pre>\n#\n# Syntax:\n# * Alles ab dem „#“-Zeichen bis zum Ende der Zeile ist ein Kommentar\n# * Jede nicht-leere Zeile ist ein regulärer Ausdruck, der gegen die Host-Namen in den URLs geprüft wird.\n\n #</pre> <!-- Diese Zeile darf nicht verändert werden! -->",
+ "spam-whitelist": " #<!-- Diese Zeile darf nicht verändert werden! --> <pre>\n# Externe URLs, die in dieser Liste enthalten sind, blockieren das Speichern einer Seite nicht, \n# auch wenn sie in der lokalen oder ggf. globalen Blockierliste enthalten sind.\n#\n# Syntax:\n# * Alles ab dem „#“-Zeichen bis zum Ende der Zeile ist ein Kommentar\n# * Jede nicht-leere Zeile ist ein regulärer Ausdruck, der gegen die Host-Namen in den URLs geprüft wird.\n\n #</pre> <!-- Diese Zeile darf nicht verändert werden! -->",
+ "email-blacklist": " #<!-- Diese Zeile darf nicht verändert werden! --> <pre>\n# E-Mail-Adressen, die in dieser Liste enthalten sind, werden bei der Registrierung sowie beim Senden von E-Mail-Nachrichten blockiert.\n# Diese Liste hat nur Auswirkungen auf dieses Wiki. Siehe gegebenenfalls auch die globale Blockierliste.\n# Siehe auch https://www.mediawiki.org/wiki/Extension:SpamBlacklist für weiterführende Informationen.\n#\n# Syntax wie folgt:\n# * Alles ab dem „#“-Zeichen bis zum Ende der Zeile ist ein Kommentar.\n# * Jede nicht-leere Zeile ist ein regulärer Ausdruck, der mit dem Hostnamen der E-Mail-Adressen abgeglichen wird.\n\n #</pre> <!-- Diese Zeile darf nicht verändert werden! -->",
+ "email-whitelist": " #<!-- Diese Zeile darf nicht verändert werden! --> <pre>\n# E-Mail-Adressen, die sich in dieser Liste befinden, blockieren die Registrierung sowie\n# das Senden von E-Mail-Nachrichten *nicht*, auch wenn sie in der \n# lokalen oder ggf. globalen Blockierliste enthalten sind.\n#\n #</pre> <!-- Diese Zeile darf nicht verändert werden! -->",
+ "spam-blacklisted-email": "Blockierte E-Mail-Adressen",
+ "spam-blacklisted-email-text": "Deine E-Mail-Adresse ist derzeit für das Senden von E-Mail-Nachrichten an andere Benutzer blockiert.",
+ "spam-blacklisted-email-signup": "Die angegebene E-Mail-Adresse ist derzeit für das Senden von E-Mail-Nachrichten an andere Benutzer blockiert.",
+ "spam-invalid-lines": "Die {{PLURAL:$1|folgende Zeile|folgenden Zeilen}} in der Blockierliste {{PLURAL:$1|ist ein ungültiger regulärer Ausdruck|sind ungültige reguläre Ausdrücke}}. Sie {{PLURAL:$1|muss|müssen}} vor dem Speichern der Seite korrigiert werden:",
+ "spam-blacklist-desc": "Ergänzt ein auf reguläre Ausdrücke gestütztes Anti-Spam-Werkzeug zum Sperren von URLs und E-Mail-Adressen für das Einfügen durch registrierte Benutzer",
+ "log-name-spamblacklist": "Spam-Blacklist-Logbuch",
+ "log-description-spamblacklist": "Es folgt ein Logbuch von Spam-Blacklist-Treffern.",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}} verursachte einen Spam-Blacklist-Treffer auf „$3“ durch das versuchte Hinzufügen von $4.",
+ "right-spamblacklistlog": "Spam-Blacklist-Logbuch ansehen",
+ "action-spamblacklistlog": "dieses Logbuch einzusehen",
+ "apihelp-spamblacklist-description": "Überprüft eine oder mehrere URLs gegen die Spam-Blacklist.",
+ "apihelp-spamblacklist-summary": "Überprüft eine oder mehrere URLs gegen die Spam-Blacklist.",
+ "apihelp-spamblacklist-param-url": "Gegen die Blacklist zu überprüfende URLs.",
+ "apihelp-spamblacklist-example-1": "Überprüft zwei URLs gegen die Blacklist"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/diq.json b/www/wiki/extensions/SpamBlacklist/i18n/diq.json
new file mode 100644
index 00000000..e07d420a
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/diq.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Aspar",
+ "Erdemaslancan",
+ "Marmase",
+ "Olvörg",
+ "Kumkumuk"
+ ]
+ },
+ "spam-blacklist": " #gıreyê teber ê ke na liste de zêpi bi bloke beni.\n # na liste tena no wiki re tesir beno.\n # Dokümantasyon: https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- no satır zey xo verdê --> <pre>\n#\n# rêzvateyê ey zey cêr o.:\n# * \"#\" karakteri ra heta satıro peyin her çi mışoreyo\n# * Her satıro dekerde, pêşkeşwan ê ke zerreyê URLlyi de tena parçeyê regexê .\n\n #</pre> <!-- no satır zey xo verdê -->",
+ "spam-whitelist": " #<!-- no satır zey xo verdê --> <pre>\n# gıreyê teber ê ke na liste de zêpi yê *bloke nêbeni*,\n# wazeno pê listeya siya zi bloke bıbo.\n#\n# rêzvate zey cêr o:\n# * \"#\" karakteri raheta satıro peyin her çi mışoreyo\n# * Her satıro dekerde, pêşkeşwan ê ke zerreyê URLlyi de tena parçeyê regexê .\n\n #</pre> <!--no satır zey xo verdê -->",
+ "email-blacklist": "#Adresê e-postay ke eno liste de esto qandê starkerdış ya zi rusnayış rê blokeyo.\n# eno liste tenya aidê eno wikiyo.Siyalisteyê globali rê bıwane.\n#Qandê dokumentasyon https://www.mediawiki.org/wiki/Extension:SpamBlacklist rê bıwane.\n#\n#Syntax zey cerêni;Hame yew karakterê \"#\" ra qediyeno u pêyê kommenti izahato. \n#Her satırê ke veng niyo yew fragmano nızamiyo u tenya qandê e-postayo.\n #</pre> <!-- Ena satıri bınuse -->",
+ "email-whitelist": "#<!-- pêroyi en satır bınuse --> <pre>\n#Adresê e-postay ke eno liste de dero bloke ''nêbeno'' eke ravêr i biyê.\n# Cı kewtışi terefê siyaliste biyo bloke.\n#\n #</pre> <!-- pêroyî in satır bınuse ,satır ino-->\n# Syntax zey ino:\n# * Hame ke be yew karakterê a \"#\" qediyeno kommentê peyêni yew izahato:\n# * Her satırê ke veng niyo yew fragmano nızamiyo u tenya qandê e-postayo.",
+ "spam-blacklisted-email": "E-posta deyayo teni liste",
+ "spam-blacklisted-email-text": "Nıka adresa e-postayê to qande karberê bini ra mesac riştene listeyê siya dero.",
+ "spam-blacklisted-email-signup": "E-posta adresiyo ke deyayo karkerdışe cı newke groto siyaliste.",
+ "spam-invalid-lines": "na qerelisteya spami {{PLURAL:$1|satır|satıran}} {{PLURAL:$1|nemeqbulo|nemeqbuli}};",
+ "spam-blacklist-desc": "Regex-tabanın haleta anti-spami URL'ya perer u adresa e-posta qande karberande qeydınan geriyayo",
+ "log-name-spamblacklist": "Qeydê siyaliste ya spami"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/dsb.json b/www/wiki/extensions/SpamBlacklist/i18n/dsb.json
new file mode 100644
index 00000000..5643b5e5
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/dsb.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "Michawiki"
+ ]
+ },
+ "spam-blacklist": " # Eksterne URL, kótarež su w toś tej lisćinje, blokěruju se, gaž pśidawaju se bokoju.\n # Toś ta lisćina nastupa jano toś ten wiki; glědaj teke globalnu cornu lisćinu.\n # Za dokumentaciju glědaj https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- Wóstaj toś tu smužka rowno tak ako jo --><pre>\n#\n# Syntaksa jo ako slědujo:\n# * Wšykno wót znamuška \"#\" až ku kóńcoju smužki jo komentar\n# Kužda smužka, kótaraž njejo prozna, jo fragment regularnego wuraza, kótaryž wótpowědujo hostam w URL\n\n #</pre> <!-- wóstaj toś tu smužku rowno ako jo -->",
+ "spam-whitelist": " #<!-- wóstaj toś tu smužka rowno tak ako jo --> <pre>\n # Eksterne URL, kótarež sw toś tej lisćinje se *nje*blokěruju, samo jolic wone by\n # se blokěrowali pśez zapiski corneje lisćiny.\n #\n # Syntaksa jo ako slědujo:\n # * Wšykno wót znamuška \"#\" ku kóńcoju smužki jo komentar\n # * Kužda smužka, kótaraž njejo prozna, jo fragment regularanego wuraza, kótaryž wótpowědujo jano hostam w URL\n\n #</pre> <!-- wóstaj toś tu smužku rowno tak ako jo -->",
+ "spam-blacklisted-email": "Blokěrowana e-mailowa adresa",
+ "spam-invalid-lines": "{{PLURAL:$1|Slědujuca smužka|Slědujucej smužce|Slědujuce smužki|Slědujuce smužki}} corneje lisćiny spama {{PLURAL:$1|jo njepłaśiwy regularny wuraz|stej njepłaśiwej regularnej wuraza|su njepłaśiwe regularne wuraze|su njepłaśiwe regularne wuraze}} a {{PLURAL:$1|musy|musytej|muse|muse}} se korigěrowaś, pjerwjej až składujoš bok:",
+ "spam-blacklist-desc": "Pśeśiwospamowy rěd na zakłaźe Regex, kótaryž zmóznja URL na bokach a e-mailowe adresy za zregistrěrowanych wužywarjow do carneje lisćiny stajiś"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/el.json b/www/wiki/extensions/SpamBlacklist/i18n/el.json
new file mode 100644
index 00000000..72ab32c2
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/el.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Dead3y3",
+ "Geraki",
+ "Nikosgranturismogt"
+ ]
+ },
+ "spam-blacklist": " # Εξωτερικά URLs που ταιριάζουν σε αυτή τη λίστα θα φραγούν όταν προστίθενται σε μία σελίδα.\n # Αυτή η λίστα επηρεάζει μόνο αυτό το wiki· αναφερθείτε επίσης στην καθολική μαύρη λίστα.\n # Για τεκμηρίωση δείτε τον σύνδεσμο https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- leave this line exactly as it is --> <pre>\n#\n# Η σύνταξη είναι ως ακολούθως:\n# * Οτιδήποτε από τον χαρακτήρα «#» μέχρι το τέλος της γραμμής είναι ένα σχόλιο\n# * Οποιαδήποτε μη κενή γραμμή είναι ένα κομμάτι κανονικής έκφρασης το οποίο θα ταιριάξει μόνο hosts\n# μέσα σε URLs\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# Εξωτερικά URLs που ταιριάζουν σε αυτή τη λίστα _δεν_ θα φραγούν ακόμα και αν είχαν\n# φραγεί από εγγραφές της μαύρης λίστας.\n#\n# Η σύνταξη είναι ως ακολούθως:\n# * Οτιδήποτε από τον χαρακτήρα «#» μέχρι το τέλος της γραμμής είναι ένα σχόλιο\n# * Οποιαδήποτε μη κενή γραμμή είναι ένα κομμάτι κανονικής έκφρασης το οποίο θα ταιριάξει μόνο hosts\n# μέσα σε URLs\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-invalid-lines": "{{PLURAL:$1|Η ακόλουθη γραμμή|Οι ακόλουθες γραμμές}} της μαύρης λίστας spam είναι {{PLURAL:$1|άκυρη κανονική έκφραση|άκυρες κανονικές εκφράσεις}} και {{PLURAL:$1|χρειάζεται|χρειάζονται}} διόρθωση πριν την αποθήκευση της σελίδας:",
+ "spam-blacklist-desc": "Εργαλείο anti-spam βασισμένο σε κανονικές εκφράσεις που επιτρέπει την τοποθέτηση διευθύνσεων URL και διευθύνσεων ηλεκτρονικών ταχυδρομείων σε μαύρη λίστα για τους εγγεγραμμένους χρήστες"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/en.json b/www/wiki/extensions/SpamBlacklist/i18n/en.json
new file mode 100644
index 00000000..e66a169a
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/en.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": []
+ },
+ "spam-blacklist": " #<!-- leave this line exactly as it is --> <pre>\n# External URLs matching this list will be blocked when added to a page.\n# This list affects only this wiki; refer also to the global blacklist.\n# For documentation see https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# Syntax is as follows:\n# * Everything from a \"#\" character to the end of the line is a comment\n# * Every non-blank line is a regex fragment which will only match hosts inside URLs\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# External URLs matching this list will *not* be blocked even if they would\n# have been blocked by blacklist entries.\n#\n# Syntax is as follows:\n# * Everything from a \"#\" character to the end of the line is a comment\n# * Every non-blank line is a regex fragment which will only match hosts inside URLs\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "email-blacklist": " #<!-- leave this line exactly as it is --> <pre>\n# Email addresses matching this list will be blocked from registering or sending emails\n# This list affects only this wiki; refer also to the global blacklist.\n# For documentation see https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# Syntax is as follows:\n# * Everything from a \"#\" character to the end of the line is a comment\n# * Every non-blank line is a regex fragment which will only match hosts inside email addresses\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "email-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# Email addresses matching this list will *not* be blocked even if they would\n# have been blocked by blacklist entries.\n#\n# Syntax is as follows:\n# * Everything from a \"#\" character to the end of the line is a comment\n# * Every non-blank line is a regex fragment which will only match hosts inside email addresses\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-blacklisted-email": "Blacklisted email address",
+ "spam-blacklisted-email-text": "Your email address is currently blacklisted from sending emails to other users.",
+ "spam-blacklisted-email-signup": "The given email address is currently blacklisted from use.",
+ "spam-invalid-lines": "The following spam blacklist {{PLURAL:$1|line is an|lines are}} invalid regular {{PLURAL:$1|expression|expressions}} and {{PLURAL:$1|needs|need}} to be corrected before saving the page:",
+ "spam-blacklist-desc": "Regex-based anti-spam tool allowing to blacklist URLs in pages and email addresses for registered users",
+ "log-name-spamblacklist": "Spam blacklist log",
+ "log-description-spamblacklist": "These events track spam blacklist hits.",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}} caused a spam blacklist hit on $3 by attempting to add $4.",
+ "right-spamblacklistlog": "View the spam blacklist log",
+ "action-spamblacklistlog": "view the spam blacklist log",
+ "apihelp-spamblacklist-description": "Validate one or more URLs against the SpamBlacklist.",
+ "apihelp-spamblacklist-summary": "Validate one or more URLs against the SpamBlacklist.",
+ "apihelp-spamblacklist-param-url": "URLs to validate against the blacklist.",
+ "apihelp-spamblacklist-example-1": "Check two URLs against the blacklist"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/eo.json b/www/wiki/extensions/SpamBlacklist/i18n/eo.json
new file mode 100644
index 00000000..33727eee
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/eo.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Yekrats"
+ ]
+ },
+ "spam-blacklist": "\n #<!-- ne ŝanĝu ĉi tiun linion iel ajn --> <pre>\n# Eksteraj URL-oj kongruante al ĉi tiuj listanoj estos forbarita kiam aldonita al paĝo.\n# Ĉi tiu listo nur regnas ĉi tiun vikion; ankaux aktivas la ĝenerala nigralisto.\n # Por dokumentaro, rigardu https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# Jen la sintakso:\n# * Ĉio ekde \"#\" signo al la fino de linio estas komento\n# * Ĉiu ne-malplena linio estas regex kodero kiu nur kongruas retnodojn ene de URL-oj\n\n #</pre> <!-- ne ŝanĝu ĉi tiun linion iel ajn -->",
+ "spam-whitelist": " #<!-- ne ŝanĝu ĉi tiun linion iel ajn --> <pre>\n# Eksteraj URL-oj kongruante al ĉi tiuj listanoj *NE* estos forbarita eĉ se ili estus\n# forbarita de nigralisto\n#\n# Jen la sintakso:\n# * Ĉio ekde \"#\" signo al la fino de linio estas komento\n# * Ĉiu nemalplena linio estas regex kodero kiu nur kongruas retnodojn ene de URL-oj\n #</pre> <!-- ne ŝanĝu ĉi tiun linion iel ajn -->",
+ "email-blacklist": " # Retadresoj kongruante de ĉi tiu listo estos forbarita de reĝistrado aŭ sendado de retpoŝtoj\n # Ĉi tiu listo nur funkciigas ĉi tiun vikion; ankaŭ rigardu la ĝeneralan nigraliston.\n # Por dokumentado, vidu https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- leave this line exactly as it is --> <pre>\n# Jen la sintakso:\n# * Ĉio ekde \"#\" signo al la fino de linio estas komento\n# * Ĉiu ne-malplena linio estas regex kodero kiu nur kongruas retnodojn ene de URL-oj\n\n #</pre> <!-- ne ŝanĝu ĉi tiun linion iel ajn -->",
+ "email-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# Retadresoj kongruante de ĉi tiu listo *ne* estos forbarita se ili estus forbarita de nigralisto.\n# \n #</pre> <!-- leave this line exactly as it is -->\n# Jen la sintakso:\n# * Ĉio ekde \"#\" signo al la fino de linio estas komento\n# * Ĉiu ne-malplena linio estas regex kodero kiu nur kongruas retnodojn ene de URL-oj",
+ "spam-blacklisted-email": "Retpoŝtadreso en nigra listo",
+ "spam-blacklisted-email-text": "Via retpoŝtadreso estas nune membro de nigralisto forbarita de sendante retpoŝtojn al aliaj uzantoj.",
+ "spam-blacklisted-email-signup": "Tiu retpoŝtadreso estas nune forbarita de uzado.",
+ "spam-invalid-lines": "La {{PLURAL:$1|jena linio|jenaj linioj}} de spama nigralisto estas {{PLURAL:$1|nevlidaj regularaj esprimoj|nevlidaj regularaj esprimoj}} kaj devas esti {{PLURAL:$1|korektigita|korektigitaj}} antaŭ savante la paĝon:",
+ "spam-blacklist-desc": "Regex-bazita kontraŭspamilo: [[MediaWiki:Spam-blacklist]] kaj [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/es.json b/www/wiki/extensions/SpamBlacklist/i18n/es.json
new file mode 100644
index 00000000..147ccac3
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/es.json
@@ -0,0 +1,34 @@
+{
+ "@metadata": {
+ "authors": [
+ "Armando-Martin",
+ "Dferg",
+ "Drini",
+ "Fitoschido",
+ "MarcoAurelio",
+ "Sanbec",
+ "Savh",
+ "Vivaelcelta",
+ "Macofe",
+ "Lemondoge",
+ "Dgstranz"
+ ]
+ },
+ "spam-blacklist": " #<!-- Deje esta línea exactamente como está --> <pre>\n# Los enlaces externos que coincidan con esta lista se bloquearán al añadirse a una página.\n# Esta lista afecta sólo a esta wiki. Consulta además la lista negra global. \n# Para documentación consulta: https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# La sintaxis es:\n# * Todo lo que aparezca desde un carácter \"#\" hasta el fin de la línea, es un comentario\n# * Toda línea que no esté en blanco, es un fragmento de expresión regular que solo coincidirá con equipos dentro de URL\n\n #</pre> <!-- Deje esta línea exactamente como está -->",
+ "spam-whitelist": " #<!-- Deje esta línea exactamente como está --> <pre>\n# Las URL externas que coincidan con esta lista *no* se bloquearán incluso si coincidiesen\n# con una entrada en la lista negra.\n#\n# La sintaxis es:\n# * Todo lo que aparezca desde un carácter \"#\" hasta el fin de la línea, es un comentario\n# * Toda línea que no esté en blanco, es un fragmento de expresión regular que solo coincidirá con equipos dentro de URL\n\n #</pre> <!-- Deje esta línea exactamente como está -->",
+ "email-blacklist": " # Las direcciones de correo electrónico que coincidan con las de esta lista no podrán registrar cuentas ni enviar correos electrónicos\n # Esta lista sólo afecta a este proyecto aunque existe una lista global para todos los proyectos.\n # Documentación: https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- leave this line exactly as it is --> <pre>\n#\n# Sintaxis como sigue:\n# * Todo lo que sigue a un \"#\" se interpreta como un comentario\n# * Toda línea no en blanco es un fragmento de expresión regular (regex) que sólo coincidirá con los \"host\" de la dirección de correo electrónico.\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "email-whitelist": " #<!-- Deje esta línea exactamente como está --> <pre>\n# Las direcciones de correo electrónico que aparecen en esta lista*no* serán bloqueadas incluso si hubieran\n# debido ser bloqueadas por aparecer en la lista negra.\n#\n #</pre> <!-- Deje esta línea exactamente como está-->\n# La sintaxis es la siguiente:\n# * Todo texto a la derecha del carácter \"#\" hasta el final de la línea es un comentario\n# * Cada línea que no esté en blanco es un fragmento de código que será cotejada por los servidores (hosts) con las direcciones de correo electrónico",
+ "spam-blacklisted-email": "Dirección de correo electrónico de la lista negra",
+ "spam-blacklisted-email-text": "Su dirección de correo electrónico está actualmente en la lista negra y no puede enviar correos electrónicos a otros usuarios.",
+ "spam-blacklisted-email-signup": "La dirección de correo electrónico dada está actualmente en la lista negra de uso.",
+ "spam-invalid-lines": "{{PLURAL:$1|La siguiente línea|Las siguientes líneas}} de la lista negra de spam {{PLURAL:$1|es una expresión regular inválida|son expresiones regulares inválidas}} y es necesario {{PLURAL:$1|corregirla|corregirlas}} antes de guardar la página:",
+ "spam-blacklist-desc": "Herramienta anti-spam basada en expresiones regulares que permite filtrar URLs en páginas y direcciones de correo electrónico para usuarios registrados",
+ "log-name-spamblacklist": "Registro de la lista negra de spam",
+ "log-description-spamblacklist": "Este registro muestra acciones bloqueadas por la lista negra de spam.",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}} ha activado la lista negra de spam en $3 al tratar de intentar agregar $4.",
+ "right-spamblacklistlog": "Ver registro de la lista negra de ''spam''",
+ "action-spamblacklistlog": "ver la lista negra de spam de registro",
+ "apihelp-spamblacklist-description": "Validar uno o más URL contra la SpamBlacklist (lista negra de spam).",
+ "apihelp-spamblacklist-param-url": "URL que validar contra la lista negra.",
+ "apihelp-spamblacklist-example-1": "Verificar dos URL contra la lista negra"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/et.json b/www/wiki/extensions/SpamBlacklist/i18n/et.json
new file mode 100644
index 00000000..dd00fedc
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/et.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Pikne"
+ ]
+ },
+ "spam-blacklist": " # Sellele nimekirjale vastavad internetiaadressid blokeeritakse.\n # See nimekiri puudutab ainult seda vikit; uuri ka globaalse musta nimekirja kohta.\n # Dokumentatsioon on asukohas https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- Jäta see rida muutmata kujule. --> <pre>\n#\n# Süntaks on järgmine:\n# * Kõik alates märgist \"#\" kuni rea lõpuni on kommentaar\n# * Iga rida, mis ei ole tühi, on regulaaravaldise osa, milleks sobib internetiaadressi osadest ainult hostinimi\n\n #</pre> <!-- Jäta see rida muutmata kujule. -->",
+ "spam-whitelist": " #<!-- Jäta see rida muutmata kujule. --> <pre>\n# Sellele nimekirjale vastavaid internetiaadresse *ei* blokeerita isegi mitte siis\n# kui musta nimekirja sissekande järgi võiks nad olla blokeeritud.\n#\n# Süntaks on järgmine:\n# * Kõik alates märgist \"#\" kuni rea lõpuni on kommentaar\n# * Iga rida, mis ei ole tühi, on regulaaravaldise osa, milleks sobib internetiaadressi osadest ainult hostinimi\n\n #</pre> <!-- Jäta see rida muutmata kujule. -->",
+ "email-blacklist": " # Sellele nimekirjale vastavatel e-posti aadressidel blokeeritakse registreerumine ja e-kirjade saatmine.\n # See nimekiri puudutab ainult seda vikit; uuri ka globaalse musta nimekirja kohta.\n # Dokumentatsioon on asukohas https://www.mediawiki.org/wiki/Extension:SpamBlacklist.\n #<!-- Jäta see rida muutmata kujule. --> <pre>\n#\n# Süntaks on järgmine:\n# * Kõik alates märgist \"#\" kuni rea lõpuni on kommentaar.\n# * Iga rida, mis ei ole tühi, on regulaaravaldise osa, mis vastab ainult e-posti aadressides sisalduvatele hostinimedele.\n\n #</pre> <!-- Jäta see rida muutmata kujule. -->",
+ "email-whitelist": " #<!-- Jäta see rida muutmata kujule. --> <pre>\n# Sellele nimekirjale vastavaid e-posti aadresse *ei* blokeerita isegi mitte siis,\n# kui musta nimekirja sissekande järgi võiks nad olla blokeeritud.\n#\n #</pre> <!-- Jäta see rida muutmata kujule. -->\n# Süntaks on järgmine:\n# * Kõik alates märgist \"#\" kuni rea lõpuni on kommentaar.\n# * Iga rida, mis ei ole tühi, on regulaaravaldise osa, mis vastab ainult e-posti aadressides sisalduvatele hostinimedele.",
+ "spam-blacklisted-email": "Musta nimekirja kantud e-posti aadress",
+ "spam-blacklisted-email-text": "Musta nimekirja sissekande tõttu on sinu e-posti aadressilt teistele kasutajatele e-kirjade saatmine praegu keelatud.",
+ "spam-blacklisted-email-signup": "Selle e-posti aadressi kasutamine on praegu musta nimekirja sissekandega keelatud.",
+ "spam-invalid-lines": "{{PLURAL:$1|Järgmine rida|Järgmised read}} rämpspostituste mustas nimekirjas on {{PLURAL:$1|vigane regulaaravaldis|vigased regulaaravaldised}} ja {{PLURAL:$1|see|need}} tuleb enne lehekülje salvestamist parandada:",
+ "spam-blacklist-desc": "Regulaaravaldisel põhinev tööriist, mis võimaldab lisada musta nimekirja lehekülgedel toodud internetiaadresse ning registreeritud kasutajate e-posti aadresse.",
+ "log-name-spamblacklist": "Rämpsu musta nimekirja logi",
+ "log-description-spamblacklist": "Siin on loetletud rämpspostituse musta nimekirja tabamused.",
+ "logentry-spamblacklist-hit": "$1 püüdis lisada leheküljele $3 rämpspostituse mustas nimekirjas olevat linki $4.",
+ "right-spamblacklistlog": "Vaadata rämpsu musta nimekirja",
+ "action-spamblacklistlog": "vaadata rämpsu musta nimekirja",
+ "apihelp-spamblacklist-description": "Ühe või enama internetiaadressi valideerimine rämpsposti musta nimekirja vastu.",
+ "apihelp-spamblacklist-param-url": "Internetiaadressid, mida musta nimekirja vastu valideerida.",
+ "apihelp-spamblacklist-example-1": "Kontrolli kaht internetiaadressi musta nimekirja vastu"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/fa.json b/www/wiki/extensions/SpamBlacklist/i18n/fa.json
new file mode 100644
index 00000000..776cb913
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/fa.json
@@ -0,0 +1,26 @@
+{
+ "@metadata": {
+ "authors": [
+ "Armin1392",
+ "Ebraminio",
+ "Huji",
+ "Meisam",
+ "Alirezaaa",
+ "Mjbmr"
+ ]
+ },
+ "spam-blacklist": " # از درج پیوندهای بیرونی که با این فهرست مطابقت کنند جلوگیری می‌شود.\n # این فهرست فقط روی همین ویکی اثر دارد؛ به فهرست سیاه سراسری نیز مراجعه کنید.\n # برای مستندات به https://www.mediawiki.org/wiki/Extension:SpamBlacklist مراجعه کنید\n #<!-- این سطر را همان‌گونه که هست رها کنید --> <pre>\n# دستورات به این شکل هستند:\n# * همه چیز از «#» تا پایان سطر به عنوان توضیح در نظر گرفته می‌شود\n# * هر سطر از متن به عنوان یک دستور از نوع عبارت باقاعده در نظر گرفته می‌شود که فقط با نام میزبان در نشانی اینترنتی مطابقت داده می‌شود\n\n #</pre> <!-- این سطر را همان‌گونه که هست رها کنید -->",
+ "spam-whitelist": " #<!-- این سطر را همان‌گونه که هست رها کنید --> <pre>\n# از درج پیوندهای بیرونی که با این فهرست مطابقت کنند جلوگیری *نمی‌شود* حتی اگر\n# در فهرست سیاه قرار داشته باشند.\n#\n #</pre> <!-- این سطر را همان‌گونه که هست رها کنید -->",
+ "email-blacklist": " # از ثبت نام یا ارسال ایمیل توسط آدرس‌های ایمیلی که با این فهرست مطابقت کنند جلوگیری می‌شود.\n # این فهرست فقط روی همین ویکی اثر دارد؛ به فهرست سیاه سراسری نیز مراجعه کنید.\n # برای مستندات به https://www.mediawiki.org/wiki/Extension:SpamBlacklist مراجعه کنید\n #<!-- این سطر را همان‌گونه که هست رها کنید --> <pre>\n# دستورات به این شکل هستند:\n# * همه چیز از «#» تا پایان سطر به عنوان توضیح در نظر گرفته می‌شود\n# * هر سطر از متن به عنوان یک دستور از نوع عبارت باقاعده در نظر گرفته می‌شود که فقط با نام دامنه در آدرس ایمیل مطابقت داده می‌شود\n\n #</pre> <!-- این سطر را همان‌گونه که هست رها کنید -->",
+ "email-whitelist": " #<!-- این سطر را همان‌گونه که هست رها کنید --> <pre>\n# آدرس‌های ایمیلی که با این فهرست مطابقت کنند محدود *نمی‌شوند* حتی اگر\n# با فهرست سیاه مطابقت داشته باشند.\n#\n #</pre> <!-- این سطر را همان‌گونه که هست رها کنید -->\n# دستورات به این شکل هستند:\n# * همه چیز از «#» تا پایان سطر به عنوان توضیح در نظر گرفته می‌شود\n# * هر سطر از متن به عنوان یک دستور از نوع عبارت باقاعده در نظر گرفته می‌شود که فقط با نام دامنه در آدرس ایمیل مطابقت داده می‌شود",
+ "spam-blacklisted-email": "آدرس ایمیل موجود در فهرست سیاه",
+ "spam-blacklisted-email-text": "آدرس ایمیل شما در حال حاضر در فهرست سیاه قرار دارد و نمی‌توانید به دیگر کاربران ایمیل بفرستید.",
+ "spam-blacklisted-email-signup": "آدرس ایمیل داده شده در حال حاضر در فهرست سیاه است.",
+ "spam-invalid-lines": "{{PLURAL:$1|سطر|سطرهای}} زیر در فهرست سیاه هرزنگاری، عبارات باقاعدهٔ نامجاز {{PLURAL:$1|است|هستند}} و قبل از ذخیره کردن صفحه باید اصلاح {{PLURAL:$1|شود|شوند}}:",
+ "spam-blacklist-desc": "ابزار بر پایهٔ عبارت باقاعده ضدهرزنگاری اجازهٔ افزودن به فهرست سیاه نشانی‌های اینترنتی در صفحات و آدرس‌های ایمیل برای کاربران ثبت نام کرده را می‌دهد",
+ "log-name-spamblacklist": "سیاههٔ فهرست سیاه هرزنگاری",
+ "log-description-spamblacklist": "این رویدادها وقوع فهرست سیاه هزنگاری را دنبال می‌کند.",
+ "logentry-spamblacklist-hit": "$1 در $3 با تلاش در افزودن $4 باعث برخورد به فهرست سیاه هرزنامه شده‌است.",
+ "right-spamblacklistlog": "دیدن یک سیاههٔ فهرست سیاه هرزنامه",
+ "action-spamblacklistlog": "دیدن سیاههٔ فهرست سیاه هرزنامه"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/fi.json b/www/wiki/extensions/SpamBlacklist/i18n/fi.json
new file mode 100644
index 00000000..49847bc4
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/fi.json
@@ -0,0 +1,27 @@
+{
+ "@metadata": {
+ "authors": [
+ "Cimon Avaro",
+ "Crt",
+ "Linnea",
+ "Nike",
+ "Olli",
+ "Pxos",
+ "01miki10"
+ ]
+ },
+ "spam-blacklist": " #<!-- leave this line exactly as it is --> <pre>\n # Tämän listan säännöillä voi estää ulkopuolisiin sivustoihin viittaavien osoitteiden lisäämisen.\n # Tämä lista koskee vain tätä wikiä. Tutustu myös järjestelmänlaajuiseen mustaan listaan.\n # Lisätietoja on osoitteessa http://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- Älä koske tähän riviin lainkaan --> <pre>\n#\n# Syntaksi on seuraavankaltainen:\n# * Kaikki #-merkistä lähtien rivin loppuun asti on kommenttia\n# * Jokainen ei-tyhjä rivi on säännöllisen lausekkeen osa, joka tunnistaa vain osoitteissa olevat verkkotunnukset.\n\n #</pre> <!-- Älä koske tähän riviin lainkaan -->",
+ "spam-whitelist": " #<!-- älä koske tähän riviin --> <pre>\n # Tällä sivulla on säännöt, joihin osuvia ulkoisia osoitteita ei estetä, vaikka ne olisivat mustalla listalla.\n#\n# Syntaksi on seuraava:\n# * Kommentti alkaa #-merkistä ja jatkuu rivin loppuun\n# * Muut ei-tyhjät rivit tulkitaan säännöllisen lausekkeen osaksi, joka tutkii vain osoitteissa olevia verkko-osoitteita.\n\n #</pre> <!-- älä koske tähän riviin -->",
+ "email-blacklist": " #<!-- leave this line exactly as it is --> <pre> \n# Tällä listalla olevia sähköpostiosoitteita estetään rekisteröitymästä tai lähettämästä sähköpostia\n# Tämä lista koskee vain tätä wikiä. Tutustu myös järjestelmänlaajuiseen mustaan listaan.\n# Lisätietoja on osoitteessa https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# Syntaksi on seuraavankaltainen:\n# * Kaikki #-merkistä lähtien rivin loppuun asti on kommenttia\n# * Jokainen ei-tyhjä rivi on säännöllisen lausekkeen osa, joka tunnistaa vain sähköpostiosoitteissa olevat verkkotunnukset.\n\n #</pre> <!-- Älä koske tähän riviin lainkaan -->",
+ "email-whitelist": " #<!-- älä koske tähän riviin --> <pre>\n# Tätä luetteloa vastaavia sähköpostiosoitteita *ei* estetä, vaikka \n# musta lista estäisi ne.\n#\n# Syntaksi on seuraava:\n# * Kommentti alkaa #-merkistä ja jatkuu rivin loppuun\n# * Muut ei-tyhjät rivit tulkitaan säännöllisen lausekkeen osaksi, joka tutkii vain sähköpostiosoitteita\n\n #</pre> <!-- älä koske tähän riviin -->",
+ "spam-blacklisted-email": "Mustalla listalla oleva sähköpostiosoite",
+ "spam-blacklisted-email-text": "Sähköpostisi on tällä hetkellä mustalla listalla, etkä voi lähettää sähköpostia muille käyttäjille.",
+ "spam-blacklisted-email-signup": "Annettu sähköpostiosoite on tällä hetkellä mustalla listalla.",
+ "spam-invalid-lines": "Listalla on {{PLURAL:$1|seuraava virheellinen säännöllinen lauseke, joka|seuraavat virheelliset säännölliset lausekkeet, jotka}} on korjattava ennen tallentamista:",
+ "spam-blacklist-desc": "Säännöllisiä lausekkeita (reg-ex) tukeva roskalinkkejä torjuva työkalu, jonka avulla internet-osoitteita (URL) sivuilla ja sähköpostiosoitteissa voidaan asettaa mustalle listalle. Tarkoitettu kirjautuneille käyttäjille.",
+ "log-name-spamblacklist": "Roskalinkkien torjuntalistan loki",
+ "log-description-spamblacklist": "Nämä tapahtumat ovat osumia roskalinkkien torjuntalistalla.",
+ "logentry-spamblacklist-hit": "$1 sai aikaan osuman roskalinkkien torjuntalistalla kohteessa $3 yrittäessään lisätä $4",
+ "right-spamblacklistlog": "Tarkastella roskalinkkien torjuntalistan lokia",
+ "action-spamblacklistlog": "nähdä roskalinkkien torjuntalistan lokia"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/fr.json b/www/wiki/extensions/SpamBlacklist/i18n/fr.json
new file mode 100644
index 00000000..a8ef4399
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/fr.json
@@ -0,0 +1,30 @@
+{
+ "@metadata": {
+ "authors": [
+ "Gomoko",
+ "Sherbrooke",
+ "Urhixidur",
+ "Verdy p",
+ "Thibaut120094",
+ "Wladek92"
+ ]
+ },
+ "spam-blacklist": " # Les liens externes faisant partie de cette liste seront bloqués lors de leur insertion dans une page.\n # Cette liste n’affecte que ce wiki ; référez-vous aussi à la liste noire globale.\n # La documentation se trouve à l’adresse suivante : https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- Laissez cette ligne telle quelle --><pre>\n#\n# La syntaxe est la suivante :\n# * tout texte qui suit un « # » est considéré comme un commentaire ;\n# * toute ligne non vide est un fragment d’expression rationnelle qui n’analysera que les hôtes dans les liens hypertextes.\n\n #</pre><!-- Laissez cette ligne telle quelle -->",
+ "spam-whitelist": " #<!-- Laissez cette ligne telle quelle--><pre>\n# Les liens hypertextes externes correspondant à cette liste ne seront *pas* bloqués\n# même s’ils auraient été bloqués par les entrées de la liste noire.\n#\n# La syntaxe est la suivante :\n# * tout texte qui suit un « # » est considéré comme un commentaire ;\n# * toute ligne non vide est un fragment d’expression rationnelle qui n’analysera que les hôtes dans les liens hypertextes.\n\n #</pre> <!--Laissez cette ligne telle quelle -->",
+ "email-blacklist": "# Les adresses de courriel correspondant à cette liste seront bloquées lors l'enregistrement ou de l'envoi d'un courriel\n # Cette liste n’affecte que ce wiki ; référez-vous aussi à la liste noire globale.\n # La documentation se trouve à l’adresse suivante : https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- Laissez cette ligne telle quelle --><pre>\n#\n# La syntaxe est la suivante :\n# * tout texte qui suit un \"#\" est considéré comme un commentaire\n# * toute ligne non vide est un fragment d’expression rationnelle qui n’analysera que les hôtes correspondant dans les URLs.\n\n #</pre><!-- Laissez cette ligne telle quelle -->",
+ "email-whitelist": "<!-- laissez cette ligne telle quelle --> <pre>\n# Les adresses de courriels correspondant à cette liste ne seront *pas* bloqués même s'ils auraient\n# dû l'être par les entrées de la liste noire.\n#\n #</pre> <!-- laissez cette ligne telle quelle -->\n# La syntaxe est comme suit :\n# * Tout texte à partir du caractère « # » jusqu'à la fin de la ligne est un commentaire.\n# * Chaque ligne non vide est un morceau de regex (expression rationnelle) qui sera mis en correspondance avec la partie « hosts » des adresses de courriels",
+ "spam-blacklisted-email": "Adresses courriel et liste noire",
+ "spam-blacklisted-email-text": "Votre adresse de courriel est actuellement sur une liste noire d'envoi de courriel aux autres utilisateurs.",
+ "spam-blacklisted-email-signup": "L'adresse de courriel fournie est actuellement sur une liste noire d'utilisation.",
+ "spam-invalid-lines": "{{PLURAL:$1|La ligne suivante|Les lignes suivantes}} de la liste noire des polluriels {{PLURAL:$1|est une expression rationnelle invalide|sont des expressions rationnelles invalides}} et doi{{PLURAL:$1||ven}}t être corrigée{{PLURAL:$1||s}} avant d’enregistrer la page :",
+ "spam-blacklist-desc": "Outil anti-pollution basé sur des expressions rationnelles permettant de mettre en liste noire des URL dans les pages et des adresses de courriel pour les utilisateurs enregistrés",
+ "log-name-spamblacklist": "Journal de liste noire des pourriels",
+ "log-description-spamblacklist": "Ces événements tracent les correspondances avec la liste noire du pollupostage.",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}} a provoqué une correspondance avec la liste noire des pourriels sur $3 en essayant d’ajouter $4.",
+ "right-spamblacklistlog": "Afficher le journal de la liste noire des pourriels",
+ "action-spamblacklistlog": "afficher le journal de la liste noir des pourriels",
+ "apihelp-spamblacklist-description": "Valider une ou plus URLs d’après SpamBlacklist.",
+ "apihelp-spamblacklist-summary": "Valider une ou plusieurs URL de la Liste Noire des pourriels.",
+ "apihelp-spamblacklist-param-url": "URLs à valider d’après la liste noire.",
+ "apihelp-spamblacklist-example-1": "Vérifier deux URLs d’après la liste noire"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/frp.json b/www/wiki/extensions/SpamBlacklist/i18n/frp.json
new file mode 100644
index 00000000..f325a52c
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/frp.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "ChrisPtDe"
+ ]
+ },
+ "spam-blacklist": " # Los lims hipèrtèxtos de defôr que sont dens ceta lista seront blocâs pendent lor entrebetâ dens una pâge.\n # Ceta lista afècte ren que ceti vouiqui ; refèrâd-vos asse-ben a la lista nêre globâla.\n # La documentacion sè trove a ceta adrèce : https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- lèssiéd ceta legne justo d’ense --> <pre>\n#\n# La sintaxa est ceta :\n# * Tot tèxto que siut un « # » est considèrâ coment un comentèro.\n# * Tota legne pas voueda est un bocon d’èxprèssion racionèla (*RegEx*) qu’analiserat ren que los hôtos dedens los lims hipèrtèxtos.\n\n #</pre> <!-- lèssiéd ceta legne justo d’ense -->",
+ "spam-whitelist": " #<!-- lèssiéd ceta legne justo d’ense --> <pre>\n# Los lims hipèrtèxtos de defôr que sont dens ceta lista seront *pas* blocâs mémo\n# s’ils ariant étâ blocâs per les entrâs de la lista nêre.\n#\n# La sintaxa est ceta :\n# * Tot tèxto que siut un « # » est considèrâ coment un comentèro.\n# * Tota legne pas voueda est un bocon d’èxprèssion racionèla (*RegEx*) qu’analiserat ren que los hôtos dedens los lims hipèrtèxtos.\n\n #</pre> <!-- lèssiéd ceta legne justo d’ense -->",
+ "spam-invalid-lines": "{{PLURAL:$1|Ceta legne|Cetes legnes}} de la lista nêre des spames {{PLURAL:$1|est una èxprèssion racionèla envalida|sont des èxprèssions racionèles envalides}} et dê{{PLURAL:$1||von}}t étre corregiê{{PLURAL:$1||s}} devant que sôvar la pâge :",
+ "spam-blacklist-desc": "Outil anti-spame basâ sur des èxprèssions racionèles (''RegEx'') : ''[[MediaWiki:Spam-blacklist]]'' et ''[[MediaWiki:Spam-whitelist]]''."
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/gl.json b/www/wiki/extensions/SpamBlacklist/i18n/gl.json
new file mode 100644
index 00000000..d3532d14
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/gl.json
@@ -0,0 +1,28 @@
+{
+ "@metadata": {
+ "authors": [
+ "Alma",
+ "Toliño",
+ "Xosé",
+ "Elisardojm"
+ ]
+ },
+ "spam-blacklist": " #<!-- Deixe esta liña tal e como está --> <pre>\n# As ligazóns externas que coincidan na súa totalidade ou en parte con algún rexistro desta lista serán bloqueadas cando se intenten engadir a unha páxina.\n# Esta lista afecta unicamente a este wiki; tamén existe unha lista global.\n# Para obter máis documentación vaia a https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# A sintaxe é a seguinte:\n# * Todo o que vaia despois dun carácter \"#\" ata o final da liña é un comentario\n# * Toda liña que non estea en branco é un fragmento de expresión regular que só coincide con dominios dentro de enderezos URL\n\n #</pre> <!-- Deixe esta liña tal e como está -->",
+ "spam-whitelist": " #<!-- Deixe esta liña tal e como está --> <pre>\n# As ligazóns externas que coincidan con esta lista *non* serán bloqueadas mesmo se\n# fosen bloqueadas mediante entradas na lista negra.\n#\n# A sintaxe é a seguinte:\n# * Todo o que vaia despois dun carácter \"#\" ata o final da liña é un comentario\n# * Toda liña que non estea en branco é un fragmento de expresión regular que só coincide con dominios dentro de enderezos URL\n\n #</pre> <!-- Deixe esta liña tal e como está -->",
+ "email-blacklist": " #<!-- Deixe esta liña tal e como está --> <pre>\n# Os enderezos de correo electrónico que coincidan na súa totalidade ou en parte con algún rexistro desta lista serán bloqueadas cando se intenten rexistrar ou se intente enviar un correo desde eles.\n# Esta lista afecta unicamente a este wiki; tamén existe unha lista global.\n# Para obter máis documentación vaia a https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# A sintaxe é a seguinte:\n# * Todo o que vaia despois dun carácter \"#\" ata o final da liña é un comentario\n# * Toda liña que non estea en branco é un fragmento de expresión regular que só coincide con dominios dentro de enderezos de correo electrónico\n\n #</pre> <!-- Deixe esta liña tal e como está -->",
+ "email-whitelist": " #<!-- Deixe esta liña tal e como está --> <pre>\n# Os enderezos de correo electrónico que coincidan con algún desta lista *non* serán bloqueados,\n# mesmo se foron bloqueados por entradas da lista negra.\n#\n# A sintaxe é a seguinte:\n# * Todo o que vaia despois dun carácter \"#\" ata o final da liña é un comentario\n# * Toda liña que non estea en branco é un fragmento de expresión regular que só coincide con dominios dentro de enderezos de correo electrónico\n\n #</pre> <!-- Deixe esta liña tal e como está -->",
+ "spam-blacklisted-email": "Enderezo de correo electrónico presente na lista negra",
+ "spam-blacklisted-email-text": "O seu enderezo de correo electrónico atópase na lista negra e non pode enviar correos electrónicos aos outros usuarios.",
+ "spam-blacklisted-email-signup": "O enderezo de correo electrónico especificado está na lista negra e non se pode empregar.",
+ "spam-invalid-lines": "{{PLURAL:$1|A seguinte liña|As seguintes}} da lista negra de spam {{PLURAL:$1|é unha expresión regular inválida|son expresións regulares inválidas}} e {{PLURAL:$1|haina|hainas}} que corrixir antes de gardar a páxina:",
+ "spam-blacklist-desc": "Ferramenta antispam baseada en expresións regulares que permite incluír enderezos URL e enderezos de correo electrónico nunha lista negra para os usuarios rexistrados",
+ "log-name-spamblacklist": "Rexistro da lista negra de spam",
+ "log-description-spamblacklist": "Este rexistro fai un seguimento das coincidencias coa lista negra de publicidade.",
+ "logentry-spamblacklist-hit": "$1 provocou a activación da lista negra de spam en \"$3\" ao intentar engadir $4.",
+ "right-spamblacklistlog": "Ver o rexistro da lista negra de spam",
+ "action-spamblacklistlog": "ver o rexistro da lista negra de spam",
+ "apihelp-spamblacklist-description": "Validar unha o máis URLs contra a lista negra de spam.",
+ "apihelp-spamblacklist-summary": "Validar unha o máis URLs contra a lista negra de spam.",
+ "apihelp-spamblacklist-param-url": "URLs a validar contra a lista negra.",
+ "apihelp-spamblacklist-example-1": "Comprobar dúas URLs contra a lista negra."
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/gsw.json b/www/wiki/extensions/SpamBlacklist/i18n/gsw.json
new file mode 100644
index 00000000..02ab0152
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/gsw.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Als-Holder"
+ ]
+ },
+ "spam-blacklist": " # Externi URL, wu in däre Lischt sin, blockiere s Spychere vu dr Syte.\n # Die Lischt giltet nume fir des Wiki; lueg au di wältwyt Blacklist.\n # Fir d Dokumentation lueg https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- Die Zyylete derf nit gänderet wäre! --> <pre>\n#\n# Syntax:\n# * Alles ab em \"#\"-Zeiche bis zum Änd vu dr Zyylete isch e Kommentar\n# * Jede Zyylete, wu nit läär isch, isch e reguläre Usdruck, wu gege d Host-Näme in dr URL prieft wird.\n\n #</pre> <!-- Die Zyylete derf nit gänderet wäre! -->",
+ "spam-whitelist": " #</pre> <!-- Die Zyylete derf nit gänderet wäre! -->\n# Externi URL, wu in däre Lischt sin, blockiere s Spychere vu dr Syte nit, au wänn si in dr wältwyte oder lokale Schwarze Lischt din sin.\n#\n# Syntax:\n# * Alles ab em \"#\"-Zeiche bis zum Änd vu dr Zyylete isch e Kommentar\n# * Jede Zyylete, wu nit läär isch, isch e reguläre Usdruck, wu gege d Host-Näme in dr URL prieft wird.\n\n #</pre> <!-- Die Zyylete derf nit gänderet wäre! -->",
+ "email-blacklist": " # E-Mail-Adrässe, wu s nume in däre Lischt het, blockiere d Regischtrierig un s Sände vu E-Mail-Nochrichte.\n # Die Lischt giltet nume fir des Wiki; lueg au di wältwyt Blacklist.\n # Fir d Dokumentation lueg https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- Die Zyylete derf nit gänderet wäre! --> <pre>\n#\n# Syntax:\n# * Alles ab em \"#\"-Zeiche bis zum Änd vu dr Zyylete isch e Kommentar\n# * Jede Zyylete, wu nit läär isch, isch e reguläre Usdruck, wu gege d Host-Näme in dr URL prieft wird.\n\n #</pre> <!-- Die Zyylete derf nit gänderet wäre! -->",
+ "email-whitelist": " #<!-- Die Zyylete derf nit gänderet wäre! -->\n# E-Mail-Adrässe, wu s nume in däre Lischt het, blockiere d Regischtrierig un \n# s Sände vu E-Mail-Nochrichte *nit*, au wänn si in dr \n# lokale oder villicht au globale Blockierlischt din sin.\n# \n #<!-- Die Zyylete derf nit gänderet wäre! --> <pre>\n# Syntax:\n# * Alles ab em \"#\"-Zeiche bis zum Änd vu dr Zyylete isch e Kommentar\n# * Jede Zyylete, wu nit läär isch, isch e reguläre Usdruck, wu gege d Host-Näme in dr URL prieft wird.",
+ "spam-blacklisted-email": "Blockierti E-Mail-Adrässe",
+ "spam-blacklisted-email-text": "Dyy E-Mail-Adräss isch zurzyt fir s Sände vu E-Mail-Nochrichte an anderi Benutzer blockiert.",
+ "spam-blacklisted-email-signup": "Di aagee E-Mail-Adräss isch zurzyt fir s Sände vu E-Mail-Nochrichte an anderi Benutzer blockiert.",
+ "spam-invalid-lines": "Die {{PLURAL:$1|Zyylete|Zyylete}} in dr Spam-Blacklist {{PLURAL:$1|isch e nit giltige reguläre Usdruck|sin nit giltigi reguläri Usdrick}}. Si {{PLURAL:$1|muess|mien}} vor em Spychere vu dr Syte korrigiert wäre:",
+ "spam-blacklist-desc": "Regex-basiert Anti-Spam-Wärchzyyg: [[MediaWiki:Spam-blacklist]] un [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/gu.json b/www/wiki/extensions/SpamBlacklist/i18n/gu.json
new file mode 100644
index 00000000..cf2ef782
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/gu.json
@@ -0,0 +1,18 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ashok modhvadia",
+ "KartikMistry",
+ "Sushant savla"
+ ]
+ },
+ "spam-blacklist": " # જ્યારે કોઈ પાનામાં આ યાદીને મળતા બાહ્ય URLs ઉમેરાશે ત્યારે તેમને રોકી દેવાશે. \n # આ યાદી માત્ર આ વિકિ પરજ કાર્યાન્વીત છે.; વૈશ્વીક પ્રતિબંધ યાદી જોવા પણ વિનંતી. \n # દસ્તાવજ માટે https://www.mediawiki.org/wiki/Extension:SpamBlacklist જુઓ.\n #<!-- leave this line exactly as it is --> <pre>\n#\n# સૂત્ર લેખન (સિન્ટેક્સ) આ પ્રમાણે છે:\n# * Everything from a \"#\" character to the end of the line is a comment\n# * Every non-blank line is a regex fragment which will only match hosts inside URLs\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-whitelist": " #<!-- આ લાઈનને એમની એમ જ રહેવા દેશો --> <pre>\n# યાદીને મળતા અવતા બાહ્ય URLs નેપ્રતિબંધિત *નહીં* કરાય પછી ભલે તેમના\n# પ્રતિબંધીત યાદીને ઍંટ્રીમાં રોક લગાડેલી હોય.\n#\n #</pre> <!-- આ લાઈનને એમની એમ જ રહેવા દેશો -->",
+ "email-blacklist": " # આ યાદીને મળતા ઈ-મેલની નોંધણી કે તેમના દ્વારા મેલ આવાગમનને રોકી દેવાશે. \n # આ યાદી માત્ર આ વિકિ પરજ કાર્યાન્વીત છે.; વૈશ્વીક પ્રતિબંધ યાદી જોવા પણ વિનંતી. \n # દસ્તાવજ માટે https://www.mediawiki.org/wiki/Extension:SpamBlacklist જુઓ.\n #<!-- leave this line exactly as it is --> <pre>\n#\n# સૂત્ર લેખન (સિન્ટેક્સ) આ પ્રમાણે છે:\n# * Everything from a \"#\" character to the end of the line is a comment\n# * Every non-blank line is a regex fragment which will only match hosts inside URLs\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "email-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# આ યાદીને મળતાં ઈ-મેલ ને પ્રતિબંધિત *નહીં* કરી શકાય પછી ભલે તેમના પર\n# પ્રતિબંધીત સૂચિ દ્વારા રોક લગાવાઈ હોય. \n#\n #</pre> <!-- leave this line exactly as it is -->\n# સૂત્ર રચના આમુજબ હશે.:\n# * Everything from a \"#\" character to the end of the line is a comment\n# * Every non-blank line is a regex fragment which will only match hosts inside e-mail addresses",
+ "spam-blacklisted-email": "પ્રતિબંધિત ઈ-મેલ સરનામું",
+ "spam-blacklisted-email-text": "તમારા ઈ-મેલ સરનામાં પર હાલમાં પ્રતિબંધ લગાડેલો છે આથી તમે ઈ-મેલ મોકલી નહીં શકો.",
+ "spam-blacklisted-email-signup": "આ ઈ-મેલ પર હાલમાં વપરાશ પ્રતિબંધ લાગેલો છે.",
+ "spam-invalid-lines": "નીચેને સ્પૅમ બ્લેકલીસ્ટમાં {{PLURAL:$1| લાઈન|લાઈનો}} અમાન્ય છે. નિયમીત {{PLURAL:$1|expression|expressions}} અને પાનુમ્ સાચવ્યાં પહેલા તેને સુધારી લેશો.",
+ "spam-blacklist-desc": "Regex-આધારિત ઍન્ટી સ્પૅમ સાધનો પાનાઓ અને નોંધાયેલા સભ્યોનાં ઇમેલ સરનામાઓમાં URLs ને બ્લેકલિસ્ટ કરવા દે છે."
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/he.json b/www/wiki/extensions/SpamBlacklist/i18n/he.json
new file mode 100644
index 00000000..39e46f61
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/he.json
@@ -0,0 +1,28 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Ofekalef",
+ "Rotem Liss",
+ "Guycn2"
+ ]
+ },
+ "spam-blacklist": " # כתובות URL חיצוניות התואמות לרשימה זו ייחסמו בעת הוספתן לדף.\n # רשימה זו משפיעה על אתר זה בלבד; שימו לב גם לרשימה הכללית.\n # לתיעוד ראו https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- נא להשאיר שורה זו בדיוק כפי שהיא --> <pre>\n#\n# התחביר הוא כדלקמן:\n# * כל דבר מתו \"#\" לסוף השורה הוא הערה\n# * כל שורה לא ריקה היא קטע מביטוי רגולרי שיתאים לשמות המתחם של כתובות URL\n\n #</pre> <!-- נא להשאיר שורה זו בדיוק כפי שהיא -->",
+ "spam-whitelist": " #<!-- נא להשאיר שורה זו בדיוק כפי שהיא --> <pre>\n# כתובות URL חיצוניות המופיעות ברשימה זו *לא* ייחסמו אפילו אם יש להן ערך ברשימת הכתובות האסורות.\n#\n# התחביר הוא כדלקמן:\n# * כל דבר מתו \"#\" לסוף השורה הוא הערה\n# * כל שורה לא ריקה היא קטע מביטוי רגולרי שיתאים לשמות המתחם של כתובות URL\n\n #</pre> <!-- נא להשאיר שורה זו בדיוק כפי שהיא -->",
+ "email-blacklist": " # עבור כתובות הדואר האלקטרוני המתאימות לרשימה זו תיחסם האפשרות להירשם ולשלוח דואר אלקטרוני\n # רשימה זו משפיעה רק על ויקי זה; שימו לב גם לרשימה הגלובלית.\n # לתיעוד ראו https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- leave this line exactly as it is --> <pre>\n#\n# התחביר הוא כדלקמן:\n# * הכול החל מהתו \"#\" עד סוף השורה הוא הערה\n# * כל שורה לא ריקה היא ביטוי רגולרי חלקי שתתאים רק לשרתים בתוך הדואר האלקטרוני\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "email-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# כתובות הדואר האלקטרוני המתאימות לרשימה זו *לא* תיחסמנה אף אם הן מתאימות לרשימה השחורה.\n#\n #</pre> <!-- leave this line exactly as it is -->\n# התחביר הוא כדלקמן:\n# * הכול החל מהתו \"#\" עד סוף השורה הוא הערה\n# * כל שורה לא ריקה היא ביטוי רגולרי חלקי שתתאים רק לשרתים בתוך הדואר האלקטרוני",
+ "spam-blacklisted-email": "כתובות דוא\"ל ברשימה השחורה",
+ "spam-blacklisted-email-text": "כתובת הדוא\"ל שלך נמצאת כרגע ברשימה השחורה של כתובות שלא ניתן לשלוח מהן הודעות למשמתמשים אחרים.",
+ "spam-blacklisted-email-signup": "כתובת הדוא\"ל הזאת נמצאת כרגע ברשימה השחורה של כתובות אסורות לשימוש.",
+ "spam-invalid-lines": "{{PLURAL:$1|השורה הבאה|השורות הבאות}} ברשימת כתובות ה־URL האסורות\n\t{{PLURAL:$1|היא ביטוי רגולרי בלתי תקין ויש לתקנה|הן ביטויים רגולריים בלתי תקינים ויש לתקנן}} לפני שמירת הדף:",
+ "spam-blacklist-desc": "כלי נגד זבל מבוסס ביטויים רגולריים ליצירת רשימה שחורה של URL־ים בדפים וכתובות דוא\"ל למשתמשים רשומים",
+ "log-name-spamblacklist": "יומן רשימה שחורה של ספאם",
+ "log-description-spamblacklist": "האירועים האלה עוקבים אחרי הפעלות של רשימה שחורה של ספאם.",
+ "logentry-spamblacklist-hit": "$1 {{GENDER:$1|גרם|גרמה}} לפעולת רשימה שחורה בדף $3 תוך כדי ניסיון להוסיף את הכתובת $4.",
+ "right-spamblacklistlog": "צפייה ביומן הרשימה השחורה של הספאם",
+ "action-spamblacklistlog": "לצפות ביומן הרשימה השחורה של הספאם",
+ "apihelp-spamblacklist-description": "לבדוק URL אחד או יותר אל מול SpamBlacklist.",
+ "apihelp-spamblacklist-summary": "בדיקת תקינות של URL אחד או יותר אל מול SpamBlacklist.",
+ "apihelp-spamblacklist-param-url": "URL־ים לבדוק אל מול SpamBlacklist.",
+ "apihelp-spamblacklist-example-1": "לבדוק שני URL־ים אל מול הרשימה השחורה."
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/hi.json b/www/wiki/extensions/SpamBlacklist/i18n/hi.json
new file mode 100644
index 00000000..15e183b5
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/hi.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kaustubh",
+ "Shyam",
+ "Sfic"
+ ]
+ },
+ "spam-blacklist": " #इस सूची में मौजूद कडियाँ जब एक पृष्ठ में जोड़ी गई बाहरी URLs से मेल खाती है तब वह पृष्ठ संपादन से बाधित हो जायेगा।\n #यह सूची केवल इस विकी पर ही प्रभावी है, विश्वव्यापी ब्लैकलिस्ट को भी उद्धृत करें।\n #प्रलेखन के लिए https://www.mediawiki.org/wiki/Extension:SpamBlacklist देखें\n #<!-- इस पंक्तीं को ऐसे के ऐसे ही रहने दें --> <pre>\n#\n#वाक्य विश्लेषण निम्नांकित है:\n# * हर जगह \"#\" संकेत से लेकर पंक्ति के अंत तक एक ही टिपण्णी है\n# * प्रत्येक अरिक्त पंक्ति एक टुकडा है जो कि URLs के अंतर्गत केवल आयोजकों से मेल खाता है\n\n #</pre> <!-- इस पंक्तीं को ऐसे के ऐसे ही रहने दें -->",
+ "spam-whitelist": " #<!-- इस पंक्तीं को ऐसे के ऐसे ही रहने दें --> <pre>\n# बाहरी कडियाँ जो इस सूची से मेल खाती है, वह कभी भी बाधित *नहीं* होंगी\n# ब्लैकलिस्ट प्रवेशिका द्वारा बाधित कि गई हैं।\n#\n# वाक्य विश्लेषण निम्नांकित है:\n# * हर जगह \"#\" संकेत से लेकर पंक्ति के अंत तक एक ही टिपण्णी है\n# * प्रत्येक अरिक्त पंक्ति एक टुकडा है जो कि URLs के अंतर्गत केवल आयोजकों से मेल खाता है\n\n #</pre> <!-- इस पंक्तीं को ऐसे के ऐसे ही रहने दें -->",
+ "spam-blacklisted-email": "कालीसूची में डला ईमेल पता",
+ "spam-invalid-lines": "निम्नांकित अवांछित ब्लैकलिस्ट {{PLURAL:$1|पंक्ति|पंक्तियाँ}} अमान्य नियमित {{PLURAL:$1|अभिव्यक्ति है|अभिव्यक्तियाँ हैं}} और पृष्ठ को जमा कराने से पहले ठीक करना चाहिए:",
+ "spam-blacklist-desc": "रेजएक्स पर आधारित स्पैम रोकने वाला उपकरण है, जो पंजीकृत सदस्यों को पन्नों और ईमेल में यूआरएल डालने से रोकता है।",
+ "log-name-spamblacklist": "स्पैम कालीसूची लॉग",
+ "right-spamblacklistlog": "स्पैम कालीसूची लॉग देखें",
+ "action-spamblacklistlog": "स्पैम कालीसूची लॉग देखें"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/hr.json b/www/wiki/extensions/SpamBlacklist/i18n/hr.json
new file mode 100644
index 00000000..dbf40e80
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/hr.json
@@ -0,0 +1,15 @@
+{
+ "@metadata": {
+ "authors": [
+ "Dnik",
+ "Roberta F.",
+ "SpeedyGonsales",
+ "Bugoslav"
+ ]
+ },
+ "spam-blacklist": " # Vanjske URLovi koji budu pronađeni pomoću ovog popisa nije moguće snimiti na stranicu wikija.\n # Ovaj popis utječe samo na ovaj wiki; provjerite globalnu \"crnu listu\".\n # Za dokumentaciju pogledajte https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- leave this line exactly as it is --> <pre>\n#\n# Rabi se sljedeća sintaksa:\n# * Sve poslije \"#\" znaka do kraja linije je komentar\n# * svaki redak koji nije prazan dio je regularnog izraza (''regex fragment'') koji odgovara imenu poslužitelja u URL-u\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# Vanjski URLovi koji budu pronađeni pomoću ovog popisa nisu blokirani\n# čak iako se nalaze na \"crnom popisu\".\n#\n# Rabi se slijedeća sintaksa:\n# * Sve poslije \"#\" znaka do kraja linije je komentar\n# * svaki neprazni redak je dio regularnog izraza (''regex fragment'') koji odgovara imenu poslužitelja u URL-u\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-invalid-lines": "{{PLURAL:$1|Slijedeći redak|Slijedeći redovi|Slijedeći redovi}} \"crnog popisa\" spama {{PLURAL:$1|je|su}} nevaljani {{PLURAL:$1|regularan izraz|regularni izrazi|regularni izrazi}} i {{PLURAL:$1|mora|moraju|moraju}} biti ispravljeni prije snimanja ove stranice:",
+ "spam-blacklist-desc": "Anti-spam alat zasnovan na reg. izrazima: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]",
+ "log-name-spamblacklist": "Evidencija crne liste neželjenoga sadržaja"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/hsb.json b/www/wiki/extensions/SpamBlacklist/i18n/hsb.json
new file mode 100644
index 00000000..47d3f652
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/hsb.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Michawiki"
+ ]
+ },
+ "spam-blacklist": " # Eksterne URL, kotrež su w lisćinje wobsahowane, blokuja składowanje strony.\n # Tuta lisćina nastupa jenož tutón Wiki; hlej tež globalnu čornu lisćinu.\n # Za dokumentaciju hlej https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- Tuta linka njesmě so změnić! --> <pre>\n#\n# Syntaksa:\n# * Wšitko wot znamjenja \"#\" hač ke kóncej linki je komentar\n# * Kóžda njeprózdna linka je regularny wuraz, kotryž so přećiwo mjenu hosta w URL pruwuje.\n\n #</pre> <!-- Tuta linka njesmě so změnić! -->",
+ "spam-whitelist": " #<!-- Tuta linka njesmě so změnić! --> <pre>\n# Eksterne URL, kotrež su w tutej lisćinje wobsahowane, njeblokuja składowanje strony, byrnjež\n# w globalnej abo lokalnej čornej lisćinje wobsahowane byli.\n#\n# Syntaksa:\n# * Wšitko wot znamjenja \"#\" hač ke kóncej linki je komentar\n# * Kóžda njeprózdna linka je regularny wuraz, kotryž so přećiwo mjenu hosta w URL pruwuje.\n\n #</pre> <!-- Tuta linka njesmě so změnić! -->",
+ "email-blacklist": "# E-mejlowe adresy, kotrež su w lisćinje wobsahowane, blokuja registrowanje a słanje e-mejlkow.\n # Tuta lisćina nastupa jenož tutón Wiki; hlej tež globalnu čornu lisćinu.\n # Za dokumentaciju hlej https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- Tuta linka njesmě so změnić! --> <pre>\n#\n# Syntaksa:\n# * Wšitko wot znamjenja \"#\" hač ke kóncej linki je komentar\n# * Kóžda njeprózdna linka je regularny wuraz, kotryž so přećiwo mjenu hosta w e-mejlach pruwuje.\n\n #</pre> <!-- Tuta linka njesmě so změnić! -->",
+ "email-whitelist": "#<!-- Tuta linka njesmě so změnić! --> <pre>\n# E-mejlowe adresy, kotrež su w tutej lisćinje, *nje*blokuja so, byrnjež so \n# přez zapiski čornje lisćiny blokowali.\n#\n #</pre> <!-- Tuta linka njesmě so změnić! -->\n# Syntaksa je slědowaca:\n# * Wšitko wot znamješka \"#\" ke kóncej linki je komentar\n# * Kóžda njeprózdna linka je regularny wuraz, kotryž jenož hostam znutřka e-mejlow wotpowěduje",
+ "spam-blacklisted-email": "E-mejlowe adresy w čornej lisćinje",
+ "spam-blacklisted-email-text": "Twoja e-mejlowa adresa je tuchwilu w čornej lisćinje a tohodla za słanje e-mejlow do druhich wužiwarjow zablokowana.",
+ "spam-blacklisted-email-signup": "Podata e-mejlowa adresa je tuchwilu přećiwo wužiwanju zablokowana.",
+ "spam-invalid-lines": "{{PLURAL:$1|slědowaca linka je njepłaćiwy regularny wuraz|slědowacych linkow je regularny wuraz|slědowace linki su regularne wurazy|slědowacej lince stej regularnej wurazaj}} a {{PLURAL:$1|dyrbi|dyrbi|dyrbja|dyrbjetej}} so korigować, prjedy hač so strona składuje:",
+ "spam-blacklist-desc": "Přećiwospamowy nastroj na zakładźe Regex, kotryž zmóznja URL na stronach a e-mejlowe adresy za zregistrowanych wužiwarjow do čorneje lisćiny stajić"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/hu.json b/www/wiki/extensions/SpamBlacklist/i18n/hu.json
new file mode 100644
index 00000000..f1032521
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/hu.json
@@ -0,0 +1,28 @@
+{
+ "@metadata": {
+ "authors": [
+ "Dani",
+ "Dj",
+ "TK-999",
+ "Samat",
+ "Tacsipacsi"
+ ]
+ },
+ "spam-blacklist": " #<!-- ezen a soron ne változtass --> <pre>\n# A lista elemeire illeszkedő külső hivatkozások blokkolva lesznek\n# A lista csak erre a wikire vonatkozik; a globális feketelistába is tedd bele.\n# Dokumentációhoz lásd a https://www.mediawiki.org/wiki/Extension:SpamBlacklist oldalt (angolul)\n#\n# A szintaktika a következő:\n# * Minden a „#” karaktertől a sor végéig megjegyzésnek számít\n# * Minden nem üres sor egy reguláris kifejezés darabja, amely csak az URL-ekben található kiszolgálókra illeszkedik\n #</pre> <!-- ezen a soron ne változtass -->",
+ "spam-whitelist": " #<!-- ezen a soron ne változtass --> <pre>\n# A lista elemeire illeszkedő külső hivatkozások *nem* lesznek blokkolva, még\n# akkor sem, ha illeszkedik egy feketelistás elemre.\n#\n# A szintaktika a következő:\n# * Minden a „#” karaktertől a sor végéig megjegyzésnek számít\n# * Minden nem üres sor egy reguláris kifejezés darabja, amely csak az URL-ekben található kiszolgálókra illeszkedik\n\n #</pre> <!-- ezen a soron ne változtass -->",
+ "email-blacklist": " #<!-- ezen a soron ne változtass --> <pre>\n# A lista elemeire illeszkedő e-mail-címek blokkolva lesznek a regisztrációnál és e-mail-küldésnél.\n# A lista csak erre a wikire vonatkozik; a globális feketelistába is tedd bele.\n# Dokumentációhoz lásd a https://www.mediawiki.org/wiki/Extension:SpamBlacklist oldalt (angolul)\n#\n# A szintaktika a következő:\n# * Minden a „#” karaktertől a sor végéig megjegyzésnek számít\n# * Minden nem üres sor egy reguláris kifejezés darabja, amely csak az e-mail-címekben található kiszolgálókra illeszkedik\n\n #</pre> <!-- ezen a soron ne változtass -->",
+ "email-whitelist": " #<!-- ezen a soron ne változtass --> <pre>\n# A lista elemeire illeszkedő e-mail-címek *nem* lesznek blokkolva, még\n# akkor sem, ha illeszkedik egy feketelistás elemre.\n#\n# A szintaktika a következő:\n# * Minden a „#” karaktertől a sor végéig megjegyzésnek számít\n# * Minden nem üres sor egy reguláris kifejezés darabja, amely csak az e-mail-címekben található kiszolgálókra illeszkedik\n\n #</pre> <!-- ezen a soron ne változtass -->",
+ "spam-blacklisted-email": "Feketelistás e-mail-cím",
+ "spam-blacklisted-email-text": "Az e-mail-címedről jelenleg nem lehet levelet küldeni más felhasználóknak.",
+ "spam-blacklisted-email-signup": "A megadott e-mail-cím jelenleg feketelistán van és nem lehet használni.",
+ "spam-invalid-lines": "Az alábbi {{PLURAL:$1|sor hibás|sorok hibásak}} a spam elleni feketelistában; {{PLURAL:$1|javítsd|javítsd őket}} mentés előtt:",
+ "spam-blacklist-desc": "Reguláris kifejezésekkel működő spamellenes eszköz lapokon található URL-ek és regisztrált felhasználók e-mail-címeinek feketelistázásához.",
+ "log-name-spamblacklist": "Spamfeketelista naplója",
+ "log-description-spamblacklist": "Ezek az események nyomon követik, amikor valaki belefutott a spamfeketelistába.",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}} belefutott a spamfeketelistába a(z) $3 lapon a(z) $4 URL-lel.",
+ "right-spamblacklistlog": "címek feketelista-naplójának megtekintése",
+ "action-spamblacklistlog": "spamfeketelista megtekintése",
+ "apihelp-spamblacklist-description": "Egy vagy több URL ellenőrzése a SpamBlacklisttel.",
+ "apihelp-spamblacklist-param-url": "Ellenőrzendő URL-ek",
+ "apihelp-spamblacklist-example-1": "Két URL ellenőrzése a feketelistán"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/ia.json b/www/wiki/extensions/SpamBlacklist/i18n/ia.json
new file mode 100644
index 00000000..bbc60b91
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/ia.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "McDutchie"
+ ]
+ },
+ "spam-blacklist": " # Le adresses URL externe correspondente a iste lista es blocate de esser addite a un pagina.\n # Iste lista ha effecto solmente in iste wiki; refere te etiam al lista nigre global.\n # Pro documentation vide https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- non modificar in alcun modo iste linea --> <pre>\n#\n# Le syntaxe es lo sequente:\n# * Toto a partir de un character \"#\" usque al fin del linea es un commento\n# * Cata linea non vacue es un fragmento de regex que se applica solmente al nomines de host intra adresses URL\n\n #</pre> <!-- non modificar in alcun modo iste linea -->",
+ "spam-whitelist": " #<!-- non modificar in alcun modo iste linea --> <pre>\n# Le adresses URL correspondente a iste lista *non* essera blocate mesmo si illos\n# haberea essite blocate per entratas in le lista nigre.\n#\n# Le syntaxe es lo sequente:\n# * Toto a partir de un character \"#\" usque al fin del linea es un commento\n# * Omne linea non vacue es un fragmento de regex que se applica solmente al nomines de host intra adresses URL\n\n #</pre> <!-- non modificar in alcun modo iste linea -->",
+ "email-blacklist": " # Le adresses de e-mail correspondente a iste lista es blocate de crear contos o inviar e-mail.\n # Iste lista ha effecto solmente in iste wiki; refere te etiam al lista nigre global.\n # Pro documentation vide https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- non modificar in alcun modo iste linea --> <pre>\n#\n# Le syntaxe es lo sequente:\n# * Toto a partir de un character \"#\" usque al fin del linea es un commento\n# * Cata linea non vacue es un fragmento de regex que se applica solmente al nomines de host in adresses de e-mail\n\n #</pre> <!-- non modificar in alcun modo iste linea -->",
+ "email-whitelist": " #<!-- non modificar in alcun modo iste linea --> <pre>\n# Le adresses de e-mail correspondente a iste lista *non* essera blocate\n# mesmo si illos haberea essite blocate per entratas de lista nigre.\n#\n# Le syntaxe es lo sequente:\n# * Toto a partir de un character \"#\" usque al fin del linea es un commento\n# * Cata linea non vacue es un fragmento de regex que se applica solmente al nomines de host in adresses de e-mail\n #</pre> <!-- non modificar in alcun modo iste linea -->",
+ "spam-blacklisted-email": "Adresse de e-mail in lista nigre",
+ "spam-blacklisted-email-text": "Tu adresse de e-mail es actualmente blocate de inviar messages a altere usatores.",
+ "spam-blacklisted-email-signup": "Le adresse de e-mail specificate es actualmente blocate per le lista nigre.",
+ "spam-invalid-lines": "Le sequente {{PLURAL:$1|linea|lineas}} del lista nigre antispam es {{PLURAL:$1|un expression|expressiones}} regular invalide e debe esser corrigite ante que tu immagazina le pagina:",
+ "spam-blacklist-desc": "Instrumento antispam a base de regex que permitte blocar URLs in paginas e adresses de e-mail pro usatores registrate",
+ "log-name-spamblacklist": "Registro del lista nigre de spam",
+ "log-description-spamblacklist": "Iste eventos tracia le activationes del lista nigre de spam.",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}} ha provocate un activation del lista nigre de spam sur $3 con su tentativa de inserer $4.",
+ "right-spamblacklistlog": "Vider le registro del lista nigre de spam",
+ "action-spamblacklistlog": "vider le registro del lista nigre de spam"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/id.json b/www/wiki/extensions/SpamBlacklist/i18n/id.json
new file mode 100644
index 00000000..4c30457e
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/id.json
@@ -0,0 +1,18 @@
+{
+ "@metadata": {
+ "authors": [
+ "Farras",
+ "IvanLanin",
+ "Meursault2004",
+ "Gombang"
+ ]
+ },
+ "spam-blacklist": "\n # URL eksternal yang cocok dengan daftar berikut akan diblokir jika ditambahkan pada suatu halaman.\n # Daftar ini hanya berpengaruh pada wiki ini; rujuklah juga daftar hitam global.\n # Untuk dokumentasi, lihat https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- biarkan baris ini seperti adanya --> <pre>\n#\n# Sintaksnya adalah sebagai berikut:\n# * Semua yang diawali dengan karakter \"#\" hingga akhir baris adalah komentar\n# * Semua baris yang tidak kosong adalah fragmen regex yang hanya akan dicocokkan dengan nama host di dalam URL\n\n #</pre> <!-- biarkan baris ini seperti adanya -->",
+ "spam-whitelist": " #<!-- biarkan baris ini seperti adanya --> <pre>\n # URL eksternal yang cocok dengan daftar berikut *tidak* akan diblokir walaupun\n# pasti akan diblokir oleh entri pada daftar hitam\n#\n# Sintaksnya adalah sebagai berikut:\n# * Semua yang diawali dengan karakter \"#\" hingga akhir baris adalah komentar\n# * Semua baris yang tidak kosong adalah fragmen regex yang hanya akan dicocokkan dengan nama host di dalam URL\n\n #</pre> <!-- biarkan baris ini seperti adanya -->",
+ "spam-blacklisted-email": "Alamat surel yang masuk daftar hitam",
+ "spam-blacklisted-email-signup": "Alamat surel yang dimasukkan saat ini sedang tidak boleh digunakan.",
+ "spam-invalid-lines": "{{PLURAL:$1|Baris|Baris-baris}} daftar hitam spam berikut adalah {{PLURAL:$1|ekspresi|ekspresi}} regular yang tak valid dan {{PLURAL:$1|perlu|perlu}} dikoreksi sebelum disimpan:",
+ "spam-blacklist-desc": "Perkakas anti-spam berbasis regex: [[MediaWiki:Spam-blacklist]] dan [[MediaWiki:Spam-whitelist]]",
+ "log-name-spamblacklist": "Catatan daftar hitam spam",
+ "right-spamblacklistlog": "Lihat catatan daftar hitam spam"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/ilo.json b/www/wiki/extensions/SpamBlacklist/i18n/ilo.json
new file mode 100644
index 00000000..a4361280
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/ilo.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Lam-ang"
+ ]
+ },
+ "spam-blacklist": " # Dagiti akinruar a URL a maipada iti daytoy a listaan ket maserraan to no mainayon ditoy a panid.\n # Daytoy a listaan ket apektaranna laeng daytoy a wiki; kitaen pay ti sangalubongan a naiparit.\n # Para iti dokumentasion kitaen ti https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- baybayan daytoy a linia --> <pre>\n#\n# Ti gramatika ket kasla dagiti sumaganad:\n# * Amin manipud iti \"#\" a karakter iti gibus ti linia ket komentario\n# * Amin a saan a blanko a linia ket regex a pedaso a maipada laeng ti nagsangaili ti uneg dagiti URL\n\n #</pre> <!-- baybayan daytoy a linia -->",
+ "spam-whitelist": " #<!-- baybayan daytoy a linia --> <pre>\n# Dagiti akinruar a panilpo a maipada iti daytoy a listaan ket *saan* a maserraan urayno\n# naseraanen babaen ti naikabil kadagiti panagiparitan a listaan.\n#\n #</pre> <!-- baybayan daytoy a linia -->",
+ "email-blacklist": " #<!-- baybay-an daytoy a linia --> <pre>\n# Dagiti adres ti esurat a maipada iti datoy a listaan ket maserraanto manipud iti panagrehistro wenno iti panagipatulod kadagiti esurat\n# Maapektuan laeng daytoy a listaan iti daytoy a wiki; kitaen pay ti global a blacklist.\n# Para iti dokumentasion kitaen ti https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# Ti sintaksis ket kas dagiti sumaganad:\n# * Amin manipud iti karakter ti \"#\" aginggana iti patingga daytoy a linia ket komentario\n# * Amin a saan a blanko a linia ket pedaso ti regex a mangipada laeng kadagiti mangsangaili iti kaunegan dagiti adres ti esurat\n\n #</pre> <!-- baybay-an daytoy a linia -->",
+ "email-whitelist": " #<!-- baybayan daytoy a linia --> <pre>\n# Dagiti adres ti esurat a maipada iti daytoy a listaan ket *saanto* a maserraan urayno \n# naserraanda babaen dagiti naikabil a blacklist.\n #</pre> <!-- baybayan daytoy a linia -->\n# Ti gramatika ket kasla dagiti sumaganad:\n# * Amin manipud iti \"#\" a karakter aginggana ti gibus iti linia ket maysa a komentario\n# * Amin a saan a blanko a linia ket pedaso ti regex a mangipada laeng ti nagsangaili ti uneg dagiti adres ti esurat",
+ "spam-blacklisted-email": "Dagiti naiparit nga adres ti esurat",
+ "spam-blacklisted-email-text": "Ti adres ti esuratmo ket agdama a naiparit manipud iti panagipatulod kadagiti esurat kadagiti sabsabali nga agar-aramat.",
+ "spam-blacklisted-email-signup": "Ti naited nga adres ti esurat ket agdama a naiparit manipud iti panagusar.",
+ "spam-invalid-lines": "Ti sumaganad a spam blacklist {{PLURAL:$1| a linia ket|kadagiti linia ket}} imbalido a kadawyan {{PLURAL:$1|a nangisao|kadagiti panangisao}} ken {{PLURAL:$1|masapsapol|masapol}} a mapudnuan sakbay nga idulin ti panid:",
+ "spam-blacklist-desc": "Naibatay ti regex a ramit ti kontra-spam a mangipalubos a mangiparit kadagiti URL kadagiti panid ken dagiti adres ti esurat para kadagiti nakarehistro nga agar-aramat",
+ "log-name-spamblacklist": "Listaan ti naiparit para iti spam",
+ "log-description-spamblacklist": "Dagitoy a pasamak ket surotenna dagiti naiparit a listaan a napuntaan ti spam.",
+ "logentry-spamblacklist-hit": "Ti $1 ket gapuanan ti pannakapunta ti naiparit a listaan ti spam iti $3 babaen ti panagpadas nga aginayon iti $4.",
+ "right-spamblacklistlog": "Kitaen ti naiparit a listaan ti spam",
+ "action-spamblacklistlog": "kitaen ti naiparit a listaan ti spam",
+ "apihelp-spamblacklist-description": "Pasingkedan ti maysa wenno ad-adu kadagiti URL iti SpamBlacklist.",
+ "apihelp-spamblacklist-param-url": "Dagiti URL a mapasingkedan iti blacklist.",
+ "apihelp-spamblacklist-example-1": "Kitaen dagiti dua nga URL iti blacklist"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/is.json b/www/wiki/extensions/SpamBlacklist/i18n/is.json
new file mode 100644
index 00000000..3021b17c
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/is.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Snævar"
+ ]
+ },
+ "spam-blacklist": " # Ytri tenglar sem passa við þennan lista er ekki hægt að bæta við á síður.\n # Þessi bannlisti hefur aðeins áhrif á þennan wiki. \n # Einnig er til altækur bannlisti sem hefur áhrif á öll wiki verkefni Wikimedia. Hann er að finna á http://meta.wikimedia.org/wiki/Spam_blacklist\n # Leiðbeiningar eru á https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- ekki breyta þessari línu --> <pre>\n#\n# Málskipan listans er eftirfarandi:\n# * Allar línur sem byrja á \"#\" eru athugasemdir\n# * Allar síður sem eru ekki tómar eru reglulegar segðir sem verða aðeins bornar saman við vefsvæði tengilsins\n\n #</pre> <!-- ekki breyta þessari línu -->",
+ "spam-whitelist": " #<!-- ekki breyta þessari línu --> <pre>\n# Ytri tenglar sem passa við þennan lista verður *hægt* að bæta við á síður, þrátt fyrir að\n# þeir séu á bannlistanum.\n#\n #</pre> <!-- ekki breyta þessari línu -->",
+ "email-blacklist": " # Netföng á þessum lista verður ekki hægt að nota til þess að skrá notenda eða senda tölvupost á notendur\n # Þessi bannlisti hefur eingöngu áhrif á þennan wiki, en einning er til altækur bannlisti sem hefur áhrif á öll wiki verkefni Wikimedia.\n # Leiðbeiningar eru á https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- ekki breyta þessari línu --> <pre>\n#\n# Málskipan listans er eftirfarandi:\n# * Allar línur sem byrja á \"#\" eru athugasemdir\n# * Allar síður sem eru ekki tómar eru reglulegar segðir sem verða aðeins bornar saman við vefsvæði netfangsins\n\n #</pre> <!-- ekki breyta þessari línu -->",
+ "email-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# Netföng sem passa við þennan lista verður *hægt* að bæta við á síður, þrátt fyrir að\n# þau séu á bannlistanum.\n#\n #</pre> <!-- leave this line exactly as it is -->\n# Málskipan listans er eftirfarandi:\n# * Allar línur sem byrja á \"#\" eru athugasemdir\n# * Allar síður sem eru ekki tómar eru reglulegar segðir sem verða aðeins bornar saman við vefsvæði netfangsins",
+ "spam-blacklisted-email": "Netfangið er á bannlista",
+ "spam-blacklisted-email-text": "Netfangið þitt er skráð á bannlista og ekki er hægt að senda tölfupóst frá því til annara notenda.",
+ "spam-blacklisted-email-signup": "Netfangið sem þú tilgreindir er á bannlista og er ekki hægt að nota.",
+ "spam-invalid-lines": "Eftirfarandi bannlista {{PLURAL:$1|færsla er ógild regluleg segð|færslur eru ógildar reglulegar segðir}} og leiðrétta þarf {{PLURAL:$1|hana|þær}} áður en síðan er vistuð:",
+ "spam-blacklist-desc": "Kæfuvörn byggð á reglulegum segðum sem gerir kleift að loka á vefslóðir á síðum og netföng skráðra notenda"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/it.json b/www/wiki/extensions/SpamBlacklist/i18n/it.json
new file mode 100644
index 00000000..e4dc55f7
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/it.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Beta16",
+ "BrokenArrow",
+ "Ximo17"
+ ]
+ },
+ "spam-blacklist": " #<!-- non modificare in alcun modo questa riga --> <pre>\n# Le URL esterne al sito che corrispondono alla lista seguente verranno bloccate.\n# La lista è valida solo per questo sito; fare riferimento anche alla blacklist globale.\n# Per la documentazione si veda https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# La sintassi è la seguente:\n# * Tutto ciò che segue un carattere \"#\" è un commento, fino al termine della riga\n# * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell'host nelle URL\n #</pre> <!-- non modificare in alcun modo questa riga -->",
+ "spam-whitelist": " #<!-- non modificare in alcun modo questa riga --> <pre>\n# Le URL esterne al sito che corrispondono alla lista seguente *non* verranno\n# bloccate, anche nel caso corrispondano a delle voci della blacklist\n#\n# La sintassi è la seguente:\n# * Tutto ciò che segue un carattere \"#\" è un commento, fino al termine della riga\n# * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell'host nelle URL\n #</pre> <!-- non modificare in alcun modo questa riga -->",
+ "email-blacklist": " #<!-- non modificare in alcun modo questa riga --> <pre>\n# Gli indirizzi email che corrispondono alla lista seguente saranno bloccati, non sarà possibile salvare o inviare email.\n# La lista è valida solo per questo sito; fare riferimento anche alla blacklist globale.\n# Per la documentazione si veda https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# La sintassi è la seguente:\n# * Tutto ciò che segue un carattere \"#\" è un commento, fino al termine della riga\n# * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell'host degli indirizzi email\n #</pre> <!-- non modificare in alcun modo questa riga -->",
+ "email-whitelist": " #<!-- non modificare in alcun modo questa riga --> <pre>\n# Gli indirizzi email che corrispondono alla lista seguente *non* verranno\n# bloccati, anche nel caso corrispondano a delle voci della blacklist\n#\n# La sintassi è la seguente:\n# * Tutto ciò che segue un carattere \"#\" è un commento, fino al termine della riga\n# * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell'host degli indirizzi email\n #</pre> <!-- non modificare in alcun modo questa riga -->",
+ "spam-blacklisted-email": "Indirizzo di posta elettronica bloccato",
+ "spam-blacklisted-email-text": "Il tuo indirizzo di posta elettronica è attualmente nella lista nera per l'invio di email verso altri utenti.",
+ "spam-blacklisted-email-signup": "L'indirizzo di posta elettronica indicato è attualmente nella lista nera.",
+ "spam-invalid-lines": "{{PLURAL:$1|La seguente riga|Le seguenti righe}} della blacklist dello spam {{PLURAL:$1|non è un'espressione regolare valida|non sono espressioni regolari valide}}; si prega di correggere {{PLURAL:$1|l'errore|gli errori}} prima di salvare la pagina.",
+ "spam-blacklist-desc": "Strumento antispam basato sulle espressioni regolari per bloccare URL e indirizzi email di utenti registrati",
+ "log-name-spamblacklist": "Spam blacklist",
+ "log-description-spamblacklist": "Questi eventi tengono traccia delle attivazioni della lista nera dello spam.",
+ "logentry-spamblacklist-hit": "$1 ha causato l'attivazione della spam blacklist su $3 tentando di aggiungere $4.",
+ "right-spamblacklistlog": "Visualizza registro della spam blacklist",
+ "action-spamblacklistlog": "vedere il registro della spam blacklist"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/ja.json b/www/wiki/extensions/SpamBlacklist/i18n/ja.json
new file mode 100644
index 00000000..5a9bfd7f
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/ja.json
@@ -0,0 +1,31 @@
+{
+ "@metadata": {
+ "authors": [
+ "Aotake",
+ "Fryed-peach",
+ "JtFuruhata",
+ "Marine-Blue",
+ "Shirayuki",
+ "Whym",
+ "Yusuke1109"
+ ]
+ },
+ "spam-blacklist": " #<!-- この行は変更しないでください --> <pre>\n# この一覧に掲載されている外部URLをページに追加すると編集をブロックします。\n# この一覧はこのウィキでのみ有効です。グローバル ブラックリストも参照してください。\n# 利用方法は https://www.mediawiki.org/wiki/Extension:SpamBlacklist/ja をご覧ください。\n#\n# 構文は以下の通りです:\n# * 「#」以降行末まではコメントです\n# * 空でない行は、URLに含まれるホスト名との一致を検出する正規表現です\n\n #</pre> <!-- この行は変更しないでください -->",
+ "spam-whitelist": " #<!-- この行は変更しないでください --> <pre>\n# この一覧に掲載されている外部URLに一致する送信元からのページ編集は、\n# たとえブラックリストに掲載されていたとしても、ブロック*されません*。\n#\n# 構文は以下の通りです:\n# * 「#」文字から行末まではコメントとして扱われます\n# * 空でない行は、URLに含まれるホスト名との一致を検出する正規表現です\n\n #</pre> <!-- この行は変更しないでください -->",
+ "email-blacklist": " #<!-- この行は変更しないでください --> <pre>\n# この一覧と一致するメールアドレスはその登録とそこからのメール送信がブロックされます。\n# この一覧はこのウィキでのみ有効です。グローバル ブラックリストも参照してください。\n# 利用方法は https://www.mediawiki.org/wiki/Extension:SpamBlacklist/ja をご覧ください。\n#\n# 構文は以下の通りです:\n# * 「#」以降行末まではコメントです\n# * 空でない行は、URLに含まれるホスト名との一致を検出する正規表現です\n\n #</pre> <!-- この行は変更しないでください -->",
+ "email-whitelist": " #<!-- この行は変更しないでください --> <pre>\n# この一覧と一致するメールアドレスはたとえブラックリストに\n# 掲載されていたとしても、ブロック*されません*。\n#\n# 構文は以下の通りです:\n# * 「#」文字から行末まではコメントとして扱われます\n# * 空でない行は、URLに含まれるホスト名との一致を検出する正規表現です\n\n #</pre> <!-- この行は変更しないでください -->",
+ "spam-blacklisted-email": "拒否リストにあるメールアドレス",
+ "spam-blacklisted-email-text": "メールアドレスが拒否リストに入っているため、他の利用者にメールを送信できません。",
+ "spam-blacklisted-email-signup": "指定されたメールアドレスは現在拒否リストに入っており、使用できません。",
+ "spam-invalid-lines": "このスパムブラックリストには、無効な{{PLURAL:$1|正規表現}}を含む{{PLURAL:$1|行}}があります。保存する前に問題部分を修正してください:",
+ "spam-blacklist-desc": "ページ内の URL や登録利用者のメールアドレスをブラックリスト化できるようにする、正規表現に基づいたスパム対策ツール",
+ "log-name-spamblacklist": "スパムブラックリスト記録",
+ "log-description-spamblacklist": "これらのイベントはスパムブラックリストとの一致を追跡します。",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}} が $3 に $4 を追加しようとした際にスパムブラックリストが発動しました。",
+ "right-spamblacklistlog": "スパムブラックリストを閲覧",
+ "action-spamblacklistlog": "スパムブラックリスト記録の閲覧",
+ "apihelp-spamblacklist-description": "1 件以上の URL についてスパムブラックリストに登録されているか検証します。",
+ "apihelp-spamblacklist-summary": "1件以上の URL についてスパムブラックリストに登録されているか検証します。",
+ "apihelp-spamblacklist-param-url": "ブラックリストに登録されているか検証する URL です。",
+ "apihelp-spamblacklist-example-1": "2 件の URL についてブラックリストに登録されているか検証"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/jut.json b/www/wiki/extensions/SpamBlacklist/i18n/jut.json
new file mode 100644
index 00000000..f01e3317
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/jut.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ælsån"
+ ]
+ },
+ "spam-blacklist-desc": "Regex-basærn anti-spem tø: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/jv.json b/www/wiki/extensions/SpamBlacklist/i18n/jv.json
new file mode 100644
index 00000000..9e445def
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/jv.json
@@ -0,0 +1,15 @@
+{
+ "@metadata": {
+ "authors": [
+ "Meursault2004",
+ "NoiX180"
+ ]
+ },
+ "spam-blacklist": " # URL eksternal sing cocog karo daftar iki bakal diblokir yèn ditambahaké ing sawijining kaca.\n # Daftar iki namung nduwé pangaruh ing wiki iki; ngrujuka uga daftar ireng global.\n # Kanggo dokumentasi, delengen https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- lirwakna baris iki apa anané --> <pre>\n#\n# Sintaksisé kaya mengkéné:\n# * Kabèh sing diawali mawa karakter \"#\" nganti tekaning akir baris iku komentar\n# * Kabèh baris sing ora kosong iku fragmèn regex sing namung bakal dicocogaké karo jeneng host sajroning URL-URL\n\n #</pre> <!-- lirwakna baris iki apa anané -->",
+ "spam-whitelist": " #<!-- lirwakna baris iki apa anané --> <pre>\n # URL èksternal sing cocog karo daftar iki *ora* bakal diblokir senadyan\n# bakal diblokir déning èntri ing daftar ireng\n#\n# Sintaksisé kaya mengkéné:\n# * Kabèh sing diawali mawa karakter \"#\" nganti tekaning akir baris iku komentar\n# * Kabèh baris sing ora kosong iku fragmèn regex sing namung bakal dicocogaké karo jeneng host sajroning URL-URL\n\n #</pre> <!-- lirwakna baris iki apa anané -->",
+ "spam-blacklisted-email": "Alamat layang-èl sing mlebu pratélan ireng",
+ "spam-blacklisted-email-text": "Alamat layang èlèktronik Sampéyan saiki didaptarirengaké saka ngirim layang èlèktronik nèng panganggi liya.",
+ "spam-blacklisted-email-signup": "Alamat layang èlèktronik sing diawèhaké saiki ora dililakaké.",
+ "spam-invalid-lines": "{{PLURAL:$1|Baris|Baris-baris}} daftar ireng spam ing ngisor iki yaiku {{PLURAL:$1|èksprèsi|èksprèsi}} regulèr sing ora absah lan {{PLURAL:$1|perlu|perlu}} dikorèksi sadurungé disimpen:",
+ "spam-blacklist-desc": "Piranti anti-spam adhedhasar regex: [[MediaWiki:Spam-blacklist]] lan [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/ka.json b/www/wiki/extensions/SpamBlacklist/i18n/ka.json
new file mode 100644
index 00000000..325182ea
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/ka.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": [
+ "David1010",
+ "გიორგიმელა",
+ "Otogi"
+ ]
+ },
+ "spam-blacklist": " # ამ სიის შესაბამისი გარე ბმულები აიკრძალება გვერდებში შესატანად.\n # ეს სია მოქმედებს მარტო ამ ვიკისთვის, თუმცა არსებობს ასევე საერთო შავი სია.\n # დამატებით ინფორმაცია გვერდზე https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- არ შეასწოროთ ეს ხაზი --> <pre>\n#\n# სინტაქსისი:\n# * ყველაფერი დაწყებული სიმბოლოთი \"#\" ხაზის ბოლომდე კომენტარად ითვლება\n# * ყველა არაცარიელი ხაზო აროს რეგულარული გამოთქმის ფრაგმენტი, რომელიც მხოლოდ URL-თან ერთად გამოიყენება\n\n #</pre> <!-- არ შეასწოროთ ეს ხაზი -->",
+ "spam-whitelist": " #<!-- არ შეასწოროთ ეს ხაზი --> <pre>\n# ის გარე ბმულები, რომლებიც ამ სიაშია შეტანილი *არ დაიბლოკება* მაშინაც კი, თუ შავ სიაში მოხვდება\n#\n# სინტაქსი:\n# * ყველაფერი სიმბოლ \"#\" иდაწყებული ბოლომდე კომენტარად ითვლება\n# * ყველა არაცარიელი ხაზი არის რეგულარული გამოთქმის ნაწილი, რომელიც მხოლოდ URL-თან ერთად გამოიყენება\n\n #</pre> <!--არ შეასწოროთ ეს ხაზი-->",
+ "email-blacklist": " # ამ სიის შესაბამისი ელ.ფოსტის მისამართები დაიბლოკება რეგისტრაციისაგან, ან ელ.ფოსტის გაგზავნისაგან\n # ეს სია მოქმედებს მარტო ამ ვიკისთვის, თუმცა არსებობს ასევე საერთო შავი სია.\n # დამატებითი ინფორმაციისათვის იხილეთ https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- არ შეასწოროთ ეს ხაზი --> <pre>\n#\n# სინტაქსი:\n# * ყველაფერი დაწყებული სიმბოლოთი \"#\" ხაზის ბოლომდე კომენტარად ითვლება\n# * ყველა არაცარიელი ხაზი არის რეგულარული გამოთქმის ფრაგმენტი, რომელიც გამოიყენება, მხოლოდ ელ.ფოსტის შიდა მისამართების კვანძებთან\n\n #</pre> <!-- არ შეასწოროთ ეს ხაზი -->",
+ "email-whitelist": " #<!-- ეს ხაზი არ შეცვალოთ --> <pre>\n# ამ სიის შესაბამისი ელ.ფოსტის მისამართები *არ* დაიბლოკება\n# იმ შემთხვევაშიც კი, თუ ისინი შავ სიაშია შეტანილი.\n#\n #</pre> <!-- ეს ხაზი არ შეცვალოთ --> \n# სინტაქსი:\n# * ყველა, დაწყებული სიმბლოთი \"#\" და ხაზის ბოლომდე ითვლება კომენტარად\n# * ყველა არაცარიელი ხაზი წარმოადგენს რეგულარული გამოხატვის ფრაგმენტს, რომელიც გამოიყენება მხოლოდ ელ.ფოსტის მისამართების შიდა კვანძებისათვის",
+ "spam-blacklisted-email": "შავ სიაში შეტანილი ელ.ფოსტის მისამართები",
+ "spam-blacklisted-email-text": "ამჟამად თქვენი ელ.ფოსტის მისამართი შეტანილია შავ სიაში, ამიტომ თქვენ არ შეგიძლიათ სხვა მომხმარებლებისათვის შეტყობინებების გაგზავნა.",
+ "spam-blacklisted-email-signup": "მითითებული ელ.ფოსტის მისამართი შეტანილია შავ სიაში და მისი გამოყენება შეუძლებელია.",
+ "spam-invalid-lines": "{{PLURAL:$1|შავი სიის შემდეგმა ხაზმა შესაძლოა შეიცავდეს არასწორი რეგულარუსლი გამოთქმა და უნდა გასწორდეს|შავი სიის შემდეგმა ხაზებმა შესაძლოა შეიცავდეს არასწორი რეგულარუსლი გამოთქმები და უნდა გასწორდეს}} შენახვამდე:",
+ "spam-blacklist-desc": "რეგულარულ გამოთქმებზე დაფუძნებული ანტი-სპამ ინსტრუმენტი[[MediaWiki:Spam-blacklist]] და [[MediaWiki:Spam-whitelist]]",
+ "log-name-spamblacklist": "სპამის შავი სიის ჟურნალი"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/kk-arab.json b/www/wiki/extensions/SpamBlacklist/i18n/kk-arab.json
new file mode 100644
index 00000000..b42a1e27
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/kk-arab.json
@@ -0,0 +1,6 @@
+{
+ "@metadata": [],
+ "spam-blacklist": " # وسى تىزىمگە سايكەس سىرتقى URL جايلار بەتكە ۇستەۋدەن بۇعاتتالادى.\n # بۇل ٴتىزىم تەك مىنداعى ۋىيكىيگە اسەر ەتەدى; تاعى دا عالامدىق قارا ٴتىزىمدى قاراپ شىعىڭىز.\n # قۇجاتتاما ٴۇشىن https://www.mediawiki.org/wiki/Extension:SpamBlacklist بەتىن قاراڭىز\n #<!-- بۇل جولدى بولعان جاعدايىمەن قالدىرىڭىز --> <pre>\n#\n# سىينتاكسىيسى كەلەسىدەي:\n# * «#» نىشانىنان باستاپ جول اياعىنا دەيىنگىلەرىنىڭ بۇكىلى ماندەمە دەپ سانالادى\n# * بوس ەمەس ٴار جول تەك URL جايلاردىڭ ىشىندەگى حوستتارعا سايكەس جۇيەلى ايتىلىمدىڭ (regex) بولىگى دەپ سانالادى\n\n #</pre> <!-- بۇل جولدى بولعان جاعدايىمەن قالدىرىڭىز -->",
+ "spam-whitelist": " #<!-- بۇل جولدى بولعان جاعدايىمەن قالدىرىڭىز --> <pre>\n# وسى تىزىمگە سايكەس سىرتقى URL جايلار *بۇعاتتالمايدى*,\n# (قارا تىزىمدەگى جازبامەن بۇعاتتالعان بولسا دا).\n#\n# سىينتاكسىيسى كەلەسىدەي:\n# * «#» نىشانىنان باستاپ جول اياعىنا دەيىنگىلەرىنىڭ بۇكىلى ماندەمە دەپ سانالادى\n# * بوس ەمەس ٴار جول تەك URL جايلاردىڭ ىشىندەگى حوستتارعا سايكەس جۇيەلى ايتىلىمدىڭ (regex) بولىگى دەپ سانالادى\n\n #</pre> <!-- بۇل جولدى بولعان جاعدايىمەن قالدىرىڭىز -->",
+ "spam-invalid-lines": "سپام قارا تىزىمىندەگى كەلەسى {{PLURAL:$1|جولدا|جولداردا}} جارامسىز جۇيەلى {{PLURAL:$1|ايتىلىم|ايتىلىمدار}} بار, جانە بەتتى ساقتاۋدىڭ {{PLURAL:$1|بۇنى|بۇلاردى}} دۇرىستاۋ كەرەك."
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/kk-cyrl.json b/www/wiki/extensions/SpamBlacklist/i18n/kk-cyrl.json
new file mode 100644
index 00000000..ca50b7b1
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/kk-cyrl.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "AlefZet",
+ "Arystanbek"
+ ]
+ },
+ "spam-blacklist": " # Осы тізімге сәйкес сыртқы URL жайлар бетке үстеуден бұғатталады.\n # Бұл тізім тек мындағы уикиге әсер етеді; тағы да ғаламдық қара тізімді қарап шығыңыз.\n # Құжаттама үшін https://www.mediawiki.org/wiki/Extension:SpamBlacklist бетін қараңыз\n #<!-- бұл жолды болған жағдайымен қалдырыңыз --> <pre>\n#\n# Синтаксисі келесідей:\n# * «#» нышанынан бастап жол аяғына дейінгілерінің бүкілі мәндеме деп саналады\n# * Бос емес әр жол тек URL жайлардың ішіндегі хосттарға сәйкес жүйелі айтылымдың (regex) бөлігі деп саналады\n\n #</pre> <!-- бұл жолды болған жағдайымен қалдырыңыз -->",
+ "spam-whitelist": " #<!-- бұл жолды болған жағдайымен қалдырыңыз --> <pre>\n# Осы тізімге сәйкес сыртқы URL жайлар *бұғатталмайды*,\n# (қара тізімдегі жазбамен бұғатталған болса да).\n#\n# Синтаксисі келесідей:\n# * «#» нышанынан бастап жол аяғына дейінгілерінің бүкілі мәндеме деп саналады\n# * Бос емес әр жол тек URL жайлардың ішіндегі хосттарға сәйкес жүйелі айтылымдың (regex) бөлігі деп саналады\n\n #</pre> <!-- бұл жолды болған жағдайымен қалдырыңыз -->",
+ "spam-blacklisted-email": "Қара тізімге енген е-почта мекенжай",
+ "spam-blacklisted-email-text": "Сіздің электронды почта мекенжайыңыз қазіргі уақытта басқа қатысушыларға электронды хат жіберуі қара тізімге енген.",
+ "spam-blacklisted-email-signup": "Берілген электронды почта мекенжай қазіргі уақытта қолданылуы қара тізімге енген.",
+ "spam-invalid-lines": "Спам қара тізіміндегі келесі {{PLURAL:$1|жолда|жолдарда}} жарамсыз жүйелі {{PLURAL:$1|айтылым|айтылымдар}} бар, және бетті сақтаудың {{PLURAL:$1|бұны|бұларды}} дұрыстау керек.",
+ "log-name-spamblacklist": "Спамдардың қаратізімі журналы",
+ "right-spamblacklistlog": "Спам қара тізімі журналын қарау",
+ "action-spamblacklistlog": "спам қара тізімі журналын қарау"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/kk-latn.json b/www/wiki/extensions/SpamBlacklist/i18n/kk-latn.json
new file mode 100644
index 00000000..ba3088ae
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/kk-latn.json
@@ -0,0 +1,6 @@
+{
+ "@metadata": [],
+ "spam-blacklist": " # Osı tizimge säýkes sırtqı URL jaýlar betke üstewden buğattaladı.\n # Bul tizim tek mındağı wïkïge äser etedi; tağı da ğalamdıq qara tizimdi qarap şığıñız.\n # Qujattama üşin https://www.mediawiki.org/wiki/Extension:SpamBlacklist betin qarañız\n #<!-- bul joldı bolğan jağdaýımen qaldırıñız --> <pre>\n#\n# Sïntaksïsi kelesideý:\n# * «#» nışanınan bastap jol ayağına deýingileriniñ bükili mändeme dep sanaladı\n# * Bos emes är jol tek URL jaýlardıñ işindegi xosttarğa säýkes jüýeli aýtılımdıñ (regex) böligi dep sanaladı\n\n #</pre> <!-- bul joldı bolğan jağdaýımen qaldırıñız -->",
+ "spam-whitelist": " #<!-- bul joldı bolğan jağdaýımen qaldırıñız --> <pre>\n# Osı tizimge säýkes sırtqı URL jaýlar *buğattalmaýdı*,\n# (qara tizimdegi jazbamen buğattalğan bolsa da).\n#\n# Sïntaksïsi kelesideý:\n# * «#» nışanınan bastap jol ayağına deýingileriniñ bükili mändeme dep sanaladı\n# * Bos emes är jol tek URL jaýlardıñ işindegi xosttarğa säýkes jüýeli aýtılımdıñ (regex) böligi dep sanaladı\n\n #</pre> <!-- bul joldı bolğan jağdaýımen qaldırıñız -->",
+ "spam-invalid-lines": "Spam qara tizimindegi kelesi {{PLURAL:$1|jolda|joldarda}} jaramsız jüýeli {{PLURAL:$1|aýtılım|aýtılımdar}} bar, jäne betti saqtawdıñ {{PLURAL:$1|bunı|bulardı}} durıstaw kerek."
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/ko.json b/www/wiki/extensions/SpamBlacklist/i18n/ko.json
new file mode 100644
index 00000000..df42c37c
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/ko.json
@@ -0,0 +1,30 @@
+{
+ "@metadata": {
+ "authors": [
+ "Albamhandae",
+ "Hym411",
+ "Klutzy",
+ "Kwj2772",
+ "아라",
+ "Ykhwong",
+ "Nuevo Paso",
+ "Garam"
+ ]
+ },
+ "spam-blacklist": " #<!-- 이 줄은 그대로 두십시오 --> <pre>\n# 이 필터에 해당하는 URL을 문서에 넣을 경우 해당 편집의 저장을 자동으로 막습니다.\n# 이 필터는 여기 위키 내에서만 적용됩니다. 광역 블랙리스트 기능이 있을 경우 해당 목록도 작동합니다.\n# 설명서에 대해서는 https://www.mediawiki.org/wiki/Extension:SpamBlacklist 문서를 참고하세요\n# \n# 문법은 다음과 같습니다:\n# * \"\"#\" 문자에서 줄의 끝까지는 주석입니다\n# * 각 줄은 정규 표현식으로, URL 문장을 검사하는 데에 사용됩니다\n\n #</pre> <!-- 이 줄은 그대로 두십시오 -->",
+ "spam-whitelist": " # <!-- 이 줄은 그대로 두십시오 --> <pre>\n# 이 목록에 포함되는 바깥 URL은 블랙리스트에 의해 차단되어\n# 있더라도 문서 편집이 제한되지 않습니다.\n#\n# 문법은 다음과 같습니다:\n# * \"#\" 문자에서 줄의 끝까지는 주석입니다\n# * 모든 줄은 URL의 호스트와 일치하는 정규 표현식의 일부분입니다\n #</pre> <!-- 이 줄은 그대로 두십시오 -->",
+ "email-blacklist": " #<!-- 이 줄은 그대로 두십시오 --> <pre>\n# 이 리스트와 일치하는 이메일 주소는 등록과 이메일 발송이 금지됩니다.\n# 이 리스트는 이 위키에만 적용됩니다; 전역 블랙리스트도 함께 참조하십시오.\n# 설명서에 대해서는 https://www.mediawiki.org/wiki/Extension:SpamBlacklist를 참조하십시오\n#\n# 문법은 다음과 같습니다:\n# * \"#\" 문자에서 줄의 끝까지는 주석입니다\n# * 빈 줄이 아닌 모든 줄은 이메일 주소의 호스트만 검사하는 정규 표현식입니다\n\n #</pre> <!-- 이 줄은 그대로 두십시오 -->",
+ "email-whitelist": " #<!-- 이 줄은 그대로 두십시오 --> <pre>\n# 이 리스트와 일치하는 이메일 주소는 블랙리스트에 올라가 있을지라도\n# 사용이 차단되지 않습니다.\n#\n# 문법은 다음과 같습니다:\n# * \"#\" 문자에서 줄의 끝까지는 주석입니다\n# * 빈 줄이 아닌 모든 줄은 이메일 주소의 호스트만 검사하는 정규 표현식입니다.\n\n #</pre> <!-- 이 줄은 그대로 두십시오 -->",
+ "spam-blacklisted-email": "이메일 주소가 블랙리스트됨",
+ "spam-blacklisted-email-text": "이메일 주소는 다른 사용자가 이메일을 보내지 못하도록 블랙리스트에 올라와 있습니다.",
+ "spam-blacklisted-email-signup": "입력한 이메일 주소는 사용할 수 없도록 블랙리스트되어 있습니다.",
+ "spam-invalid-lines": "스팸 블랙리스트의 다음 {{PLURAL:$1|줄}}에 잘못된 정규 {{PLURAL:$1|표현식}}이 사용되어 문서를 저장하기 전에 바르게 고쳐져{{PLURAL:$1|야 합니다}}:",
+ "spam-blacklist-desc": "정규 표현식을 사용해 문서에 있는 URL과 등록된 사용자의 이메일 주소를 블랙리스트 처리하여 스팸을 막는 도구",
+ "log-name-spamblacklist": "스팸 블랙리스트 기록",
+ "log-description-spamblacklist": "이 사건은 스팸 블랙리스트의 일치를 추적합니다.",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}} 사용자가 $3 문서에 $4을(를) 추가하려 하자 스팸 블랙리스트의 일치가 일어났습니다.",
+ "right-spamblacklistlog": "스팸 블랙리스트 기록 보기",
+ "action-spamblacklistlog": "스팸 블랙리스트 기록을 볼",
+ "apihelp-spamblacklist-description": "SpamBlacklist에 대해 하나 이상의 URL의 유효성을 확인합니다.",
+ "apihelp-spamblacklist-summary": "SpamBlacklist에 대해 하나 이상의 URL의 유효성을 확인합니다."
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/ksh.json b/www/wiki/extensions/SpamBlacklist/i18n/ksh.json
new file mode 100644
index 00000000..459d4d89
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/ksh.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Purodha"
+ ]
+ },
+ "spam-blacklist": " # URLs noh ußerhallef uß dä Leß wäde nit zojelohße, wann se einer en en Sigg erin donn well.\n # Heh di Liß eß bloß för heh dat Wiki joot. Loor Der och de jemeinsame „schwazze Leß“ aan.\n # Dokkementeet is dat op https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- Loß di Reih hee jenou esu wi se es --> <pre>\n# Dä Opbou es:\n# * Alles fun enem #-Zeiche bes an et Engk fun ene Reih es ene Kommentaa för de Minsche\n# * Jede Reih met jet dren es e Stöck rejolähre Ußdrok, wat alleins Domains en URLs treffe kann\n\n #</pre> <!-- Lohß di Reih he jenou esu wi se es -->",
+ "spam-whitelist": " #<!-- Loß di Reih hee jenou esu wi se es --> <pre>\n# URLs noh ußerhallef uß dä Leß wäde dorschjelohße,\n# sellefts wann se op en „schwazze Leß“ shtonn\n# Dä Opbou es:\n# * Alles fun enem #-Zeiche bes an et Engk fun ene Reih es ene Kommentaa för de Minsche\n# * Jede Reih met jet dren es e Stöck rejolähre Ußdrok, wat alleins Domains en URLs treffe kann\n #</pre> <!-- Lohß di Reih he jenou esu wi se es -->",
+ "email-blacklist": " # e-mail-Addräße uß dä Leß wäde nit zojelohße beim Aanmälde un beim e-mail-Verschecke.\n # Heh di Liß eß bloß för heh dat Wiki joot. Loor Der och de jemeinsame „schwazze Leß“ aan.\n # Dokkementeet is dat op https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- Loß di Reih hee jenou esu wi se es --> <pre>\n# Dä Opbou es:\n# * Alles fun enem #-Zeiche bes an et Engk fun ene Reih es ene Kommentaa för de Minsche\n# * Jede Reih met jet dren es ene rejolähre Ußdrok, wohmet dä Name vum Rääschner en de e-mail-Addräße jeprööf wääde kann.\n\n #</pre> <!-- Lohß di Reih he jenou esu wi se es -->",
+ "email-whitelist": " #<!-- Loß di Reih hee jenou esu wi se es --> <pre>\n# e-mail-Addräße uß dä Leß wäde zojelohße beim Aanmälde un beim e-mail-Verschecke,\n# och wann se op en „schwazze Leß“ schtonn.\n#\n #</pre> <!-- Lohß di Reih he jenou esu wi se es -->\n# Dä Opbou es:\n# * Alles fun enem #-Zeiche bes an et Engk fun ene Reih es ene Kommentaa för de Minsche\n# * Jede Reih met jet dren es ene rejolähre Ußdrok, wohmet dä Name vum Rääschner en de e-mail-Addräße jeprööf wääde kann.",
+ "spam-blacklisted-email": "Di <i lang=\"en\">e-mail</i>-Addräß es op der „schwazze Lėß“",
+ "spam-blacklisted-email-text": "Ding <i lang=\"en\">e-mail</i>-Addräß es em Momang op dä „schwazze Lėß“ un De kanns dermet kein <i lang=\"en\">e-mail</i> aan ander Metmaacher verschecke.",
+ "spam-blacklisted-email-signup": "Di aanjejovve Adräß för de <i lang=\"en\">e-mail</i> es em Momang op dä „schwazze Lėß“ un kann nit jebruch wähde.",
+ "spam-invalid-lines": "Mer han Fähler en rejolähre Ußdröck jefonge.\n{{PLURAL:$1|De Reih onge schtemmp nit un moß|Di $1 Reije onge schtemme nit un möße|Dat sull}}\nför em Afschpeischere eets en Oodenong jebraat wääde:",
+ "spam-blacklist-desc": "Met rejolähre Ußdröck jääje der <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„in der Regel massenhaft übertragene unerwünschte Nachrichten“\">SPAM</i> — övver en [[MediaWiki:Spam-blacklist|„schwazze Leß“]] med <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i>s en Sigg un <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräße för aanjemälldte Metmaacher.",
+ "log-name-spamblacklist": "Et Logbohch vun de „schwazze Leß“ för der <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"in der Regel massenhaft übertragene unerwünschte Nachrichten\">SPAM</i>",
+ "log-description-spamblacklist": "Heh di Vörjäng verfollje de Träffer en de „schwazze Leß“ jähje der <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„in der Regel massenhaft übertragene unerwünschte Nachrichten“\">SPAM</i>.",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hädd_ene Träffer en de „schwazze Leß“ jähje der <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„in der Regel massenhaft übertragene unerwünschte Nachrichten“\">SPAM</i> op dä Sigg „$3“ ußjelöhß, wi {{GENDER:$2|hä|et|hä|sei|et}} „$4“ doh eren donn wullt.",
+ "right-spamblacklistlog": "Donn et Logbohch vun de „schwazze Leß“ för der <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"in der Regel massenhaft übertragene unerwünschte Nachrichten\">SPAM</i> aanlohre",
+ "action-spamblacklistlog": "donn et Logbohch vun de „schwazze Leß“ för der <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"in der Regel massenhaft übertragene unerwünschte Nachrichten\">SPAM</i> aanlohre",
+ "apihelp-spamblacklist-description": "Donn <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locators\">URLs</i> jähje de „schwazze Leß“ jähje der <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"in der Regel massenhaft übertragene unerwünschte Nachrichten\">SPAM</i> pröhve.",
+ "apihelp-spamblacklist-param-url": "De <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locators\">URLs</i> zom Pröhve jähje de „schwazze Leß“.",
+ "apihelp-spamblacklist-example-1": "Donn zwai <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locators\">URLs</i> jähje de „schwazze Leß“ pröhve."
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/lb.json b/www/wiki/extensions/SpamBlacklist/i18n/lb.json
new file mode 100644
index 00000000..832d1a39
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/lb.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Robby"
+ ]
+ },
+ "spam-blacklisted-email": "Gespaart Mail-Adressen",
+ "spam-blacklisted-email-text": "Är Mailadress ass elo gespaart fir anere Benotzer Mailen ze schécken.",
+ "spam-blacklisted-email-signup": "D'Mailadress déi Dir uginn hutt ass elo gespaart fir anere Benotzer Mailen ze schécken.",
+ "spam-blacklist-desc": "Op regulären Ausdréck (Regex) opgebauten Tool deen et erlaabt URLe vu Säiten op eng schwaarz Lëscht ze setzen an e-Mail-Adresssen vu registréierte Benotzer"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/li.json b/www/wiki/extensions/SpamBlacklist/i18n/li.json
new file mode 100644
index 00000000..1fd1e3ed
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/li.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "Matthias",
+ "Ooswesthoesbes"
+ ]
+ },
+ "spam-blacklist": " # Externe URL's die voldoen aan deze lijst waere geweigerd bie 't\n # toevoege aan 'n pagina. Deze lijst haet allein invloed op deze wiki.\n # Er bestaot ouk 'n globale zwarte lijst.\n # Documentatie: https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- laot deze lien --> <pre>\n#\n# De syntax is as volg:\n# * Alles vanaaf 't karakter \"#\" tot 't einde van de regel is opmerking\n# * Iedere niet-lege regel is 'n fragment van 'n reguliere oetdrukking die\n# alleen van toepassing is op hosts binne URL's.\n\n #</pre> <!-- laot deze lien -->",
+ "spam-whitelist": " #<!-- laot deze lien --> <pre>\n# Externe URL's die voldoen aan deze lijst, waere *nooit* geweigerd, al\n# zoude ze geblokkeerd motte waere door regels oet de zwarte lijst.\n#\n# De syntaxis is es volg:\n# * Alles vanaaf 't karakter \"#\" tot 't einde van de regel is opmerking\n# * Iddere neet-lege regel is 'n fragment van 'n reguliere oetdrukking die\n# allein van toepassing is op hosts binne URL's.\n\n #</pre> <!-- laot deze lien -->",
+ "email-blacklist": " # E-mailadresse die voldoon aan dees lies waere geblokkeerd bie 't registrere of 't versjikke van e-mails.\n # Dees lis haet allein invlood op deze wiki. d'r Besteit ouch 'n wikiwiej zwarte lies.\n # Documentatie: https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- laot dees lien wie zie is --> <pre>\n#\n# De syntax is es volg:\n# * Alles vanaaf 't karakter \"#\" toet 't ènj vanne regel is 'n opmèrking\n# * Edere neet-laege regel is e fragment van 'n regulier oetdrökking die\n# allein van toepassing is op óngerbringers binne e-mailadresse.\n\n #</pre> <!-- laot dees lien wie zie is -->",
+ "email-whitelist": " #<!-- laot dees lien wie zie is --> <pre>\n# E-mailadresse die voldoon aan dees lies, waere *noeatj* geweigerd, al\n# zówwe ze geblokkeerd mótte waere door regels oete zwarte lies.\n#\n# De syntaxis is es volg:\n# * Alles vanaaf 't karakter \"#\" toet 't ènj vanne regel is opmèrking\n# * Edere neet-laege regel is e fragment van 'n regulier oetdrökking die\n# allein van toepassing is op óngerbringers binne e-mailadresse.\n\n #</pre> <!-- laot dees lien wie zie is -->",
+ "spam-blacklisted-email": "E-mailadres oppe zwarte lies",
+ "spam-blacklisted-email-text": "Dien e-mailadres steit momenteel oppe zwarte lies wodoor se gein e-mails nao anger gebroekers kins versjikke.",
+ "spam-blacklisted-email-signup": "'t Opgegaeve e-mailadres steit momenteel oppe zwarte lies.",
+ "spam-invalid-lines": "De volgende {{PLURAL:$1|regel|regel}} van de zwarte lies {{PLURAL:$1|is 'n|zeen}} onzjuuste reguliere {{PLURAL:$1|oetdrukking|oetdrukkinge}} en {{PLURAL:$1|mót|mótte}} verbaeterd waere alveures de pazjena kin waere opgeslage:",
+ "spam-blacklist-desc": "Antispamfunctionaliteit via reguliere expressies: [[MediaWiki:Spam-blacklist]] en [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/lki.json b/www/wiki/extensions/SpamBlacklist/i18n/lki.json
new file mode 100644
index 00000000..b7e05572
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/lki.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hosseinblue",
+ "Lakzon"
+ ]
+ },
+ "spam-blacklist": " # از درج پیوندهای بیرونی که با این فهرست مطابقت کنند جلوگیری می‌شود.\n # این فهرست فقط روی همین ویکی اثر دارد؛ به فهرست سیاه سراسری نیز مراجعه کنید.\n # برای مستندات به https://www.mediawiki.org/wiki/Extension:SpamBlacklist مراجعه کنید\n #<!-- این سطر را همان‌گونه که هست رها کنید --> <pre>\n# دستورات به این شکل هستند:\n# * همه چیز از «#» تا پایان سطر به عنوان توضیح در نظر گرفته می‌شود\n# * هر سطر از متن به عنوان یک دستور از نوع عبارت باقاعده در نظر گرفته می‌شود که فقط با نام میزبان در نشانی اینترنتی مطابقت داده می‌شود\n\n #</pre> <!-- این سطر را همان‌گونه که هست رها کنید -->",
+ "spam-whitelist": " #<!-- این سطر را همان‌گونه که هست رها کنید --> <pre>\n# از درج پیوندهای بیرونی که با این فهرست مطابقت کنند جلوگیری *نمی‌شود* حتی اگر\n# در فهرست سیاه قرار داشته باشند.\n#\n #</pre> <!-- این سطر را همان‌گونه که هست رها کنید -->",
+ "email-blacklist": " # از ثبت نام یا ارسال ایمیل توسط آدرس‌های ایمیلی که با این فهرست مطابقت کنند جلوگیری می‌شود.\n # این فهرست فقط روی همین ویکی اثر دارد؛ به فهرست سیاه سراسری نیز مراجعه کنید.\n # برای مستندات به https://www.mediawiki.org/wiki/Extension:SpamBlacklist مراجعه کنید\n #<!-- این سطر را همان‌گونه که هست رها کنید --> <pre>\n# دستورات به این شکل هستند:\n# * همه چیز از «#» تا پایان سطر به عنوان توضیح در نظر گرفته می‌شود\n# * هر سطر از متن به عنوان یک دستور از نوع عبارت باقاعده در نظر گرفته می‌شود که فقط با نام دامنه در آدرس ایمیل مطابقت داده می‌شود\n\n #</pre> <!-- این سطر را همان‌گونه که هست رها کنید -->",
+ "email-whitelist": " #<!-- این سطر را همان‌گونه که هست رها کنید --> <pre>\n# آدرس‌های ایمیلی که با این فهرست مطابقت کنند محدود *نمی‌شوند* حتی اگر\n# با فهرست سیاه مطابقت داشته باشند.\n#\n #</pre> <!-- این سطر را همان‌گونه که هست رها کنید -->\n# دستورات به این شکل هستند:\n# * همه چیز از «#» تا پایان سطر به عنوان توضیح در نظر گرفته می‌شود\n# * هر سطر از متن به عنوان یک دستور از نوع عبارت باقاعده در نظر گرفته می‌شود که فقط با نام دامنه در آدرس ایمیل مطابقت داده می‌شود",
+ "spam-blacklisted-email": "آدرس ایمیل موجود در فهرست سیاه",
+ "spam-blacklisted-email-text": "آدرس ایمیل شما در حال حاضر در فهرست سیاه قرار دارد و نمی‌توانید به دیگر کاربران ایمیل بفرستید.",
+ "spam-blacklisted-email-signup": "آدرس ایمیل داده شده در حال حاضر در فهرست سیاه است.",
+ "spam-invalid-lines": "{{PLURAL:$1|سطر|سطرهای}} زیر در فهرست سیاه هرزنگاری، عبارات باقاعدهٔ نامجاز {{PLURAL:$1|است|هستند}} و قبل از ذخیره کردن صفحه باید اصلاح {{PLURAL:$1|شود|شوند}}:",
+ "spam-blacklist-desc": "ابزار بر پایهٔ عبارت باقاعده ضدهرزنگاری اجازهٔ افزودن به فهرست سیاه نشانی‌های اینترنتی در صفحات و آدرس‌های ایمیل برای کاربران ثبت نام کرده را می‌دهد",
+ "log-name-spamblacklist": "سیاههٔ فهرست سیاه هرزنگاری",
+ "log-description-spamblacklist": "این رویدادها وقوع فهرست سیاه هزنگاری را دنبال می‌کند.",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|}}$1 در $3 با تلاش در افزودن $4 باعث برخورد به فهرست سیاه هرزنامه شده‌است.",
+ "right-spamblacklistlog": "دیدن یک سیاههٔ فهرست سیاه هرزنامه",
+ "action-spamblacklistlog": "دیدن سیاههٔ فهرست سیاه هرزنامه"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/lrc.json b/www/wiki/extensions/SpamBlacklist/i18n/lrc.json
new file mode 100644
index 00000000..7a0cbb52
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/lrc.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "Bonevarluri",
+ "Mogoeilor"
+ ]
+ },
+ "spam-blacklisted-email": "تیرنشون انجونامه یایی که ها د نومجا سئ",
+ "log-name-spamblacklist": "پهرستنومه نوم گه سئ اسپم",
+ "right-spamblacklistlog": "دیئن پهرستنومه نوم گه سئ اسپم",
+ "action-spamblacklistlog": "دیئن پهرستنومه نوم گه سئ اسپم"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/lt.json b/www/wiki/extensions/SpamBlacklist/i18n/lt.json
new file mode 100644
index 00000000..f6282e8c
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/lt.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Albertas",
+ "Homo"
+ ]
+ },
+ "spam-blacklist": " #<!-- palikite šią eilutę tiksliai tokią, kokia ji yra --> <pre>\n# Išorinės URL nuorodos patenkančios į šį sąrašą bus blokuojamos, įterpus jas į puslapį.\n# Šis sąrašas paveiks tik šį vikį; taip pat galite remtis globaliu juoduoju nuorodų sąrašu.\n# Dokumentacijai žiūrėkite https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# Sintaksė tokia:\n# * Viskas nuo \"#\" simbolio iki eilutės galo yra komentaras\n# * Kiekviena ne tuščia eilutė yra reguliariosios išraiškos fragmentas, kuris atitinka tik URL nuorodose esančius serverių pavadinimus\n\n #</pre> <!-- palikite šią eilutę tiksliai tokią, kokia ji yra -->",
+ "spam-whitelist": " #<!-- palikite šią eilutę tiksliai tokią, kokia ji yra --> <pre>\n# Išorinės URL nuorodos, patenkančios į šį sąrašą, *nebus* užklokuojamos, net jeigu būtų užblokuotos juodojo sąrašo įrašais.\n#\n# Sintaksė tokia:\n# * Viskas po \"#\" simbolio iki eilutės pabaigos yra komentaras\n# * Kiekvienas netuščia eilutė yra reguliariosios išraiškos fragmentas, kuris atitinka URL nuorodose esančius serverių vardus\n\n #</pre> <!-- palikite šią eilutę tiksliai tokią, kokia ji yra -->",
+ "email-blacklist": " #<!-- palikite šią eilutę tiksliai tokią, kokia ji yra --> <pre>\n# El. pašto adresai patenkantys į šį sąrašą bus užblokuoti, kad su jais nebūtų galima susikurti paskyros ir siųsti el. laiškų.\n# Šis sąrašas paveiks tik šį vikį; taip pat galite remtis ir globaliu juoduoju sąrašu.\n# Dokumentaciją galite rasti čia https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# Sintaksė tokia:\n# * Viskas nuo \"#\" simbolio iki eilutės pabaigos yra komentaras\n# * Kiekviena netuščia eilutė yra reguliariosios išraiškos fragmentas, kuris žymį el. pašto serverio pavadinimą\n\n #</pre> <!-- palikite šią eilutę tiksliai tokią, kokia ji yra -->",
+ "email-whitelist": " #<!-- palikite šią eilutę tiksliai tokią, kokia ji yra --> <pre>\n# El. pašto adresai, patenkantys į šį sąrašą, *nebus* blokuojami, net jeigu būtų blokuojami juodojo sąrašo įrašais.\n#\n# Sintaksė tokia:\n# * Viskas nuo \"#\" simbolio iki eilutės pabaigos yra komentaras\n# * Kiekviena netuščia eilutė yra reguliariosios išraiškos fragmentas, kuris žymi tik el. pašto serverio vardą\n\n #</pre> <!-- palikite šią eilutę tiksliai tokią, kokia ji yra -->",
+ "spam-blacklisted-email": "El. pašto adresai, įtraukti į juodąjį sąrašą",
+ "spam-blacklisted-email-text": "Jūsų el. pašto adresas dabar yra įtrauktas į juodąjį sąrašą, kad negalėtumėte siųsti el. laiškų kitiems naudotojams.",
+ "spam-blacklisted-email-signup": "Nurodytasis el. pašto adresas dabar yra įtrauktas į juodąjį sąrašą, kad juo nebūtų galima naudotis.",
+ "spam-invalid-lines": "{{PLURAL:$1|Ši brukalo juodojo sąrašo eilutė yra|Šios brukalo juodojo sąrašo eilutės yra}} {{PLURAL:$1|netinkama reguliarioji išraiška|netinkamos reguliariosios išraiškos}} ir {{PLURAL:$1|ją reikia|jas reikia}} pataisyti prieš išsaugant puslapį:",
+ "spam-blacklist-desc": "Reguliariomis išraiškomis grįstas anti brukalinis įrankis, leidžiantis puslapiuose esančias URL nuorodas ir prisiregistravusių naudotojų el. pašto adresus įtraukti į juodąjį sąrašą",
+ "log-name-spamblacklist": "Brukalo juodojo sąrašo žurnalas",
+ "log-description-spamblacklist": "Čia pateikiami bandymai pridėti nuorodas, nukreipiančias į juodajame sąraše esančias svetaines.",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}} bandymas $3 puslapyje pridėti $4 buvo aptiktas brukalo filtro.",
+ "right-spamblacklistlog": "Peržiūrėti brukalo juodojo sąrašo žurnalą",
+ "action-spamblacklistlog": "peržiūrėti brukalo juodojo sąrašo žurnalą",
+ "apihelp-spamblacklist-description": "Patikrinti vieną arba daugiau URL nuorodų ar jos nėra SpamBlacklist.",
+ "apihelp-spamblacklist-param-url": "URL nuorodos, kurias patikrinti, ar nėra juodajame sąraše.",
+ "apihelp-spamblacklist-example-1": "Patikrinti dvi URL nuorodas, ar nėra juodajame sąraše"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/min.json b/www/wiki/extensions/SpamBlacklist/i18n/min.json
new file mode 100644
index 00000000..bf03f6c3
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/min.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Iwan Novirion"
+ ]
+ },
+ "spam-blacklist-desc": "Pakakeh anti-spam babasis regex: [[MediaWiki:Spam-blacklist]] jo [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/mk.json b/www/wiki/extensions/SpamBlacklist/i18n/mk.json
new file mode 100644
index 00000000..ffdd4ced
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/mk.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Bjankuloski06"
+ ]
+ },
+ "spam-blacklist": "# Надворешните URL адреси кои одговараат на наведеното на овој список ќе бидат блокирани кога ќе се постават на страница.\n # Овој список важи само за ова вики; погледајте ја и глобалниот црн список.\n # За документација, видете https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- leave this line exactly as it is --> <pre>\n#\n# Синтаксата е следнава:\n# * Сè од знакот „#“ до крајот на редот е коментар\n# * Секој ред кој не е празен е фрагмент од регуларен израз кој се совпаѓа само со домаќини во URL адреси\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# Надворешните URL адреси одговараат на списокот *нема* да бидат блокирани дури и во случај да\n# се блокирани од ставки на црниот список.\n#\n# Синтаксата е следнава:\n# * Сè од знакот „#“ до крајот на редот е коментар\n# * Секој ред кој не е празен е фрагмент од регуларен израз кој се совпаѓа само со домаќини во URL адреси\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "email-blacklist": "# На е-поштенските адреси што ќе се совпаднат со списоков *нема* ќе им биде забрането регистрирањето и испраќањето на пошта\n# Списоков важи само за ова вики; погледајте го и глобалниот црн список.\n# Документација ќе најдете на https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#<!-- не менувајте го овој ред --> <pre>\n#\n# Синтаксата е следнава:\n# * Сето она што се наоѓа по знакот „#“ (па до крајот на редот) е коментар\n# * Секој непразен ред е извадок од регуларен израз кој одговара само на домаќини во е-пошта\n\n #</pre> <!-- не менувајте го овој ред -->",
+ "email-whitelist": "#<!-- не менувајте го овој ред --> <pre>\n# Е-поштенските адреси што ќе се совпаднат со списоков *нема* да бидат блокирани, дури и \n# ако треба да се блокираат согласно записите во црниот список.\n#\n #</pre> <!-- не менувајте го овој ред -->\n# Синтаксата е следнава:\n# * Сето она што стои по знакот „#“ (па до крајот на редот) е коментар\n# * Секој непразен ред е извадок од регуларен израз кој одговара само на домаќини во е-пошта",
+ "spam-blacklisted-email": "Забранета адреса",
+ "spam-blacklisted-email-text": "На вашата адреса моментално не ѝ е дозволено да испраќа е-пошта на други корисници.",
+ "spam-blacklisted-email-signup": "Употребата на дадената адреса е моментално забранета.",
+ "spam-invalid-lines": "{{PLURAL:$1|Следниов ред во црниот список на спам е|Следниве редови во црниот список на спам се}} {{PLURAL:$1|погрешен регуларен израз|погрешни регуларни изрази}} и {{PLURAL:$1|треба да се поправи|треба да се поправат}} пред да се зачува страницата:",
+ "spam-blacklist-desc": "Алатка против спам на основа на регуларни изрази што овозможува забрана на URL и е-поштенски адреси за корисници",
+ "log-name-spamblacklist": "Дневник за спам од црниот список",
+ "log-description-spamblacklist": "Овие настани следат обиди на спам од црниот список.",
+ "logentry-spamblacklist-hit": "$1 стави спам заведен во црниот список $3 при обидот да ја додаде адресата $4.",
+ "right-spamblacklistlog": "Преглед на дневникот за спам од црниот список",
+ "action-spamblacklistlog": "преглед на дневникот за спам од црниот список",
+ "apihelp-spamblacklist-description": "Провери една или повеќе URL-адреси во Црниот список на спам.",
+ "apihelp-spamblacklist-summary": "Провери една или повеќе URL-адреси во Црниот список на спам.",
+ "apihelp-spamblacklist-param-url": "URL-адреси што треба да се проверат во црниот список.",
+ "apihelp-spamblacklist-example-1": "Провери две URL-адреси во црниот список"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/ml.json b/www/wiki/extensions/SpamBlacklist/i18n/ml.json
new file mode 100644
index 00000000..abc0b5cb
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/ml.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Praveenp"
+ ]
+ },
+ "spam-blacklist": "# ഈ ലിസ്റ്റുമായി ഒത്തുപോകുന്ന പുറത്തേയ്ക്കുള്ള യൂ.ആർ.എല്ലുകൾ താളിൽ ചേർക്കപ്പെട്ടാൽ തടയുന്നതായിരിക്കും.\n # ഈ ലിസ്റ്റ് ഈ വിക്കിയ്ക്കു മാത്രം ബാധകമായ ഒന്നാണ്; ആഗോള കരിമ്പട്ടികയും പരിശോധിക്കുക.\n # ഉപയോഗ സഹായിയ്ക്കായി https://www.mediawiki.org/wiki/Extension:SpamBlacklist കാണുക\n #<!-- ഈ വരിയിൽ മാറ്റം വരുത്തരുത് --> <pre>\n#\n# എഴുതേണ്ട രീതി താഴെ കൊടുക്കുന്നു:\n# * \"#\" ലിപിയിൽ തുടങ്ങി വരിയുടെ അവസാനം വരെയുള്ള എന്തും കുറിപ്പ് (comment) ആയി കണക്കാക്കും\n# * Every non-blank line is a regex fragment which will only match hosts inside URLs\n\n #</pre> <!-- ഈ വരിയിൽ മാറ്റം വരുത്തരുത് -->",
+ "spam-whitelist": " #<!-- ഈ വരി ഇതുപോലെ തന്നെ സൂക്ഷിക്കുക --> <pre>\n# കരിമ്പട്ടികയിലെ ഉൾപ്പെടുത്തലുകളുമായി ഒത്തുപോയെങ്കിൽ കൂടി,\n# ഈ ലിസ്റ്റുമായി ഒത്തുപോകുന്ന പുറത്തുനിന്നുള്ള യൂ.ആർ.എല്ലുകൾ തടയപ്പെടുക *ഇല്ല*\n#\n# എഴുത്തുരീതി താഴെ കൊടുക്കുന്നു:\n# * \"#\" അക്ഷരത്തിൽ തുടങ്ങി വരിയുടെ അവസാനം വരെയുള്ളതെന്തും കുറിപ്പായി കണക്കാക്കും\n# * റെജെക്സ് ഘടകത്തിലെ ശൂന്യമല്ലാത്ത വരികൾ എല്ലാം ആന്തരിക യൂ.ആർ.എല്ലുമായി ഒത്തു നോക്കുകയുള്ളു\n\n #</pre> <!-- ഈ വരി ഇതുപോലെ തന്നെ സൂക്ഷിക്കുക -->",
+ "email-blacklist": " # ഈ പട്ടികയോട് സദൃശമായ ഇമെയിൽ വിലാസങ്ങൾ രജിസ്റ്റർ ചെയ്യുന്നതും ഇമെയിലുകൾ അയയ്ക്കുന്നതും തടയപ്പെടുന്നതാണ്\n # ഈ പട്ടിക ഈ വിക്കിയിൽ മാത്രമേ പ്രാവർത്തികമാകൂ; ആഗോള കരിമ്പട്ടികയും കാണുക.\n # വിവരണത്തിനായി https://www.mediawiki.org/wiki/Extension:SpamBlacklist കാണുക\n #<!-- ഈ വരിയിൽ മാറ്റം വരുത്താൻ പാടില്ല --> <pre>\n#\n# എഴുത്തുരീതി താഴെക്കൊടുക്കുന്നു:\n# * \"#\" അക്ഷരത്തിൽ തുടങ്ങി വരിയുടെ അവസാനം വരെയുള്ളവ കുറിപ്പായിരിക്കും\n# * എല്ലാ ശൂന്യമല്ലാത്ത വരികളും ഇമെയിൽ വിലാസത്തിലെ ഹോസ്റ്റുമായി ഒത്തുനോക്കപ്പെടുന്ന രെജെക്സ് ഘടകമായിരിക്കും\n\n #</pre> <!-- ഈ വരിയിൽ മാറ്റം വരുത്താൻ പാടില്ല -->",
+ "email-whitelist": " #<!-- ഈ വരിയിൽ മാറ്റം വരുത്താൻ പാടില്ല --> <pre>\n# ഈ പട്ടികയോട് സദൃശമായ ഇമെയിൽ വിലാസങ്ങൾ, അവ കരിമ്പട്ടികയിലെ ഉൾപ്പെടുത്തലുകളുമായി\n# സദൃശമാണെങ്കിൽ പോലും *തടയപ്പെടില്ല*.\n#\n #</pre> <!-- ഈ വരിയിൽ മാറ്റം വരുത്താൻ പാടില്ല -->\n# എഴുത്തുരീതി താഴെക്കൊടുക്കുന്നു:\n# * \"#\" അക്ഷരത്തിൽ തുടങ്ങി വരിയുടെ അവസാനം വരെയുള്ളവ കുറിപ്പായിരിക്കും\n# * എല്ലാ ശൂന്യമല്ലാത്ത വരികളും ഇമെയിൽ വിലാസത്തിലെ ഹോസ്റ്റുമായി ഒത്തുനോക്കപ്പെടുന്ന രെജെക്സ് ഘടകമായിരിക്കും",
+ "spam-blacklisted-email": "കരിമ്പട്ടികയിൽ പെട്ട ഇമെയിൽ",
+ "spam-blacklisted-email-text": "താങ്കളുടെ ഇമെയിൽ വിലാസം ഇപ്പോൾ മറ്റുള്ളവർക്ക് എഴുത്തയക്കാനാവാത്ത കരിമ്പട്ടികയിൽ ഉൾപ്പെട്ടിരിക്കുന്നു.",
+ "spam-blacklisted-email-signup": "നൽകിയ ഇമെയിൽ വിലാസം ഇപ്പോൾ കരിമ്പട്ടികയിൽ പെട്ടിരിക്കുന്ന ഒന്നാണ്.",
+ "spam-invalid-lines": "താഴെ കൊടുത്തിരിക്കുന്ന പാഴെഴുത്ത് കരിമ്പട്ടികയിലെ {{PLURAL:$1|വരി ഒരു|വരികൾ}} അസാധുവായ റെഗുലർ {{PLURAL:$1|എക്സ്‌‌പ്രെഷൻ|എക്സ്‌‌പ്രെഷനുകൾ}} ആണ്, താൾ സേവ് ചെയ്യുന്നതിനു മുമ്പ് {{PLURAL:$1|അത്|അവ}} ശരിയാക്കേണ്ടതുണ്ട്:",
+ "spam-blacklist-desc": "അംഗത്വമെടുത്ത ഉപയോക്താക്കൾ യു.ആർ.എല്ലുകളും ഇമെയിൽ വിലാസങ്ങളും, താളുകളിൽ ചേർക്കുന്നത് കരിമ്പട്ടികയിൽ പെടുത്താനുള്ള റെജെക്സ്-അധിഷ്ഠിത പാഴെഴുത്ത് തടയൽ ഉപകരണം",
+ "log-name-spamblacklist": "പാഴെഴുത്ത് കരിമ്പട്ടിക രേഖ",
+ "log-description-spamblacklist": "പാഴെഴുത്ത് കരിമ്പട്ടികയെ ഉണർത്തിയ പ്രവൃത്തികളുടെ രേഖ.",
+ "logentry-spamblacklist-hit": "$3 എന്ന താളിൽ $4 എന്നത് ചേർക്കാൻ $1 നടത്തിയ ശ്രമം പാഴെഴുത്ത് കരിമ്പട്ടികയിൽ കുടുങ്ങിയിരിക്കുന്നു.",
+ "right-spamblacklistlog": "പാഴെഴുത്ത് കരിമ്പട്ടിക രേഖ കാണുക",
+ "action-spamblacklistlog": "പാഴെഴുത്ത് കരിമ്പട്ടിക രേഖ കാണുക",
+ "apihelp-spamblacklist-description": "പാഴെഴുത്ത് കരിമ്പട്ടികയിൽ ഒന്നോ അതിലധികമോ യു.ആർ.എല്ലുകൾ പരിശോധിക്കുക.",
+ "apihelp-spamblacklist-param-url": "കരിമ്പട്ടികയിൽ പരിശോധിക്കേണ്ട യു.ആർ.എല്ലുകൾ",
+ "apihelp-spamblacklist-example-1": "കരിമ്പട്ടികയിൽ രണ്ട് യു.ആർ.എല്ലുകൾ പരിശോധിക്കുക"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/mr.json b/www/wiki/extensions/SpamBlacklist/i18n/mr.json
new file mode 100644
index 00000000..a624ec21
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/mr.json
@@ -0,0 +1,18 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hiteshgotarane",
+ "Kaustubh",
+ "Rahuldeshmukh101",
+ "संतोष दहिवळ",
+ "V.narsikar"
+ ]
+ },
+ "spam-blacklist": " # या यादीशी जुळणारे बाह्य दुवे एखाद्या पानावर दिल्यास ब्लॉक केले जातील.\n # ही यादी फक्त या विकिसाठी आहे, सर्व विकिंसाठीची यादी सुद्धा तपासा.\n # अधिक माहिती साठी पहा https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- leave this line exactly as it is --> <pre>\n#\n# रुपरेषा खालीलप्रमाणे:\n# * \"#\" ने सुरु होणारी ओळ शेरा आहे\n# * प्रत्येक रिकामी नसलेली ओळ अंतर्गत URL जुळविणारी regex फ्रॅगमेंट आहे\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-whitelist": " # या यादीशी जुळणारे बाह्य दुवे एखाद्या पानावर दिल्यास ब्लॉक केले *जाणार नाहीत*.\n # ही यादी फक्त या विकिसाठी आहे, सर्व विकिंसाठीची यादी सुद्धा तपासा.\n # अधिक माहिती साठी पहा http://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- leave this line exactly as it is --> <pre>\n#\n# रुपरेषा खालीलप्रमाणे:\n# * \"#\" ने सुरु होणारी ओळ शेरा आहे\n# * प्रत्येक रिकामी नसलेली ओळ अंतर्गत URL जुळविणारी regex फ्रॅगमेंट आहे\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-blacklisted-email": "प्रतिबंधित विपत्र पत्ता",
+ "spam-blacklisted-email-text": "तुमचा ई-पत्ता काळ्या यादीत समाविष्ट करण्यात आला आहे. इतर सदस्यांना संपर्क करणे शक्य नाही.",
+ "spam-blacklisted-email-signup": "दिलेला विपत्र पत्ता सद्य वापरण्यास प्रतिबंधित केलेला आहे",
+ "spam-invalid-lines": "हे पान जतन करण्यापूर्वी खालील {{PLURAL:$1|ओळ जी चुकीची|ओळी ज्या चुकीच्या}} एक्स्प्रेशन {{PLURAL:$1|आहे|आहेत}}, दुरुस्त करणे गरजेचे आहे:",
+ "spam-blacklist-desc": "रेजएक्स-आधारीत स्पॅमविरोधी उपकरण,जे नोंदणीकृत सदस्यांना, पानांवरील यूआरएल्स(URLs) व विपत्रपत्त्यांची काळी-यादी करण्यास परवानगी देते"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/ms.json b/www/wiki/extensions/SpamBlacklist/i18n/ms.json
new file mode 100644
index 00000000..1574e5de
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/ms.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": [
+ "Anakmalaysia",
+ "Aviator",
+ "Pizza1016",
+ "Jeluang Terluang"
+ ]
+ },
+ "spam-blacklist": "# URL luar yang sepadan dengan mana-mana entri dalam senarai ini akan disekat daripada ditambah ke dalam sesebuah laman.\n# Senarai ini melibatkan wiki ini sahaja; sila rujuk juga senarai hitam sejagat. \n# Sila baca pendokumenan di https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#<!-- jangan ubah baris ini --> <pre>\n#\n# Sintaks adalah seperti berikut:\n# * Semuanya mulai aksara \"#\" hingga akhir baris merupakan komen\n# * Setiap baris yang tidak kosong meruakan pecahan ungkapan nalar yang hanya akan berpadan dengan hos-hos dalam alamat e-mel\n\n #</pre> <!-- jangan ubah baris ini -->",
+ "spam-whitelist": " #<!-- jangan ubah baris ini --> <pre>\n# URL luar yang sepadan dengan mana-mana entri dalam senarai ini tidak akan\n# disekat walaupun terdapat juga dalam senarai hitam.\n#\n# Sintaks:\n# * Aksara \"#\" sampai akhir baris diabaikan\n# * Ungkapan nalar dibaca daripada setiap baris dan dipadankan dengan nama hos sahaja\n\n #</pre> <!-- jangan ubah baris ini -->",
+ "email-blacklist": " # Alamat-alamat e-mel yang berpadanan dengan senarai ini akan disekat daripada mendaftar atau menghantar e-mel\n # Senarai ini melibatkan wiki ini sahaja; sila rujuk juga senarai hitam sejagat.\n # Untuk pendokumenan, rujuk https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- jangan ubah baris ini --> <pre>\n#\n# Sintaks adalah seperti berikut:\n# * Semuanya mulai aksara \"#\" hingga akhir baris merupakan komen\n# * Setiap baris yang tidak kosong merupakan pecahan ungkapan nalar yang hanya akan berpadan dengan hos-hos dalam alamat e-mel\n\n #</pre> <!-- jangan ubah baris ini -->",
+ "email-whitelist": " #<!-- jangan ubah baris ini --> <pre>\n# Alamat-alamat e-mel yang berpadanan dengan senarai ini *tidak* akan disekat sungguhpun boleh\n# disekat oleh entri senarai hitam.\n#\n# Sintaks adalah seperti berikut:\n# * Segalanya mulai aksara \"#\" hingga akhir baris ialah komen\n# * Setiap baris yang tidak kosong meruakan pecahan ungkapan nalar yang hanya akan berpadan dengan hos-hos dalam alamat e-mel\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-blacklisted-email": "E-mel yang Disenaraihitamkan",
+ "spam-blacklisted-email-text": "Alamat e-mel anda kini disenaraihitamkan daripada menghantar e-mel kepada pengguna lain.",
+ "spam-blacklisted-email-signup": "Alamat e-mel yang diberikan ini kini disenaraihitamkan.",
+ "spam-invalid-lines": "{{PLURAL:$1|Baris|Baris-baris}} berikut menggunakan ungkapan nalar yang tidak sah. Sila baiki senarai hitam ini sebelum menyimpannya:",
+ "spam-blacklist-desc": "Alat anti-spam berdasarkan ungkapan nalar: [[MediaWiki:Spam-blacklist]] dan [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/nap.json b/www/wiki/extensions/SpamBlacklist/i18n/nap.json
new file mode 100644
index 00000000..2670e31a
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/nap.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "C.R."
+ ]
+ },
+ "spam-blacklist": " #<!-- lassa sta linea comm'è mo' --> <pre>\n# Ll'url esterne ca s'azzeccano dint'a st'elenco sarranno bluccate quanno s'azzecarranno a na paggena.\n# St'elenco s'apprecase surtanto a sta wiki; si vulite vedite l'elenco niro globbale.\n# Pe' documentazione vedite https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# 'A sintassi sta ccà abbascio:\n# * Tuttuquante 'e nu carattere \"#\" a 'o fine d' 'a linea è nu commento\n# * Tuttuquante linee 'n bianco songo nu fragmento regex ca mmustarrà surtanto 'e host dint'a n'URL\n\n #</pre> <!-- lassa sta linea tale quale comm'è mo' -->",
+ "spam-whitelist": " #<!-- lassa sta linea accussì comm' 'è --> <pre>\n# L' URLs 'e fore ca s'azzeccassero a st'elenco *nun* sarranno bloccate pure quanno se songo mise dint'a\n# l'elenco 'e site bluccate p' 'a lista nera.\n#\n# 'A sintasse è chesta ccà, oj cann:\n# * Ognecose ca tène 'o carattere \"#\" mponta 'a fine d' 'a linea è nu commento\n# * Ogne linea ca nun è abbacante è nu frammento 'e regex ca ve facesse 'o cunfronto cu ll'host dint'a ll'URL\n\n #</pre> <!-- lassate sta linea accussì comm'è -->",
+ "email-blacklist": " #<!-- lassate sta linea comm'è mo' --> <pre>\n# Indirizze e-mail, quanno fossero azzeccate a st'elenco sarranno bluccate 'e se ffà 'o riggistro o mannà mail.\n# St'elenco s'apprecase surtanto a sta wiki; si vulite vedite l'elenco niro globbale.\n# Pe' documentazione vedite https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# 'A sintassi 'a vedite ccà abbascio, oj cann:\n# * Tuttuquante 'e nu carattere \"#\" a 'o fine d' 'a linea è nu commento\n# * Tuttuquante linee 'n bianco songo nu fragmento regex ca mmustarrà surtanto 'e host dint'a n'URL\n\n #</pre> <!-- lassate sta linea tale quale comm'è mo' -->",
+ "email-whitelist": " #<!-- lassate sta linea accussì comm' 'è --> <pre>\n# E-mail ca s'azzeccassero a st'elenco *nun* sarranno bloccate pure quanno se songo mise dint'a\n# l'elenco 'e site bluccate p' 'a lista nera.\n#\n# 'A sintasse è chesta ccà, oj cann:\n# * Ognecose ca tène 'o carattere \"#\" mponta 'a fine d' 'a linea è nu commento\n# * Ogne linea ca nun è abbacante è nu frammento 'e regex ca ve facesse 'o cunfronto cu ll'host dint'a ll'URL\n\n #</pre> <!-- lassate sta linea accussì comm'è -->",
+ "spam-blacklisted-email": "Elenco 'email a gnurà",
+ "spam-blacklisted-email-text": "'O ndirizzo mail d' 'o vuosto è mo' mo' dint'a na lista nira pe' nun putè mannà mmasciate a ll'ati utente",
+ "spam-blacklisted-email-signup": "'O indirizzo e-mail dato è dint'a lista nira pe' nun 'o puté ausà.",
+ "spam-invalid-lines": "Dint'a l'elenco nero 'e spam {{PLURAL:$1|'a linea ccà|'e linee ccà}} {{PLURAL:$1|è n'espressione|songo espressiune}} regolare e {{PLURAL:$1|ce buò|ce vonno}} l'arricette primm' 'e sarvà 'a paggena:",
+ "spam-blacklist-desc": "'O tool anti-spam basato ncopp' 'o Regex-based premmettesse 'e ce miettere dint' 'a lista nira tutte l'URLs dint' 'e paggene e indirizze email pe utente riggistrate",
+ "log-name-spamblacklist": "Riggistro d' 'a lista nira p' 'o spam",
+ "log-description-spamblacklist": "Sti evente se pigliassero e cuntrullasero 'e click dint'a l'elenco niro d' 'o spam.",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}} causaje na trasuta dint'a l'elenco niro dint'a $3 pe' pruvà 'e s'azzeccà $4.",
+ "right-spamblacklistlog": "Vide 'o riggistro d' 'a lista nira",
+ "action-spamblacklistlog": "vide 'o riggistro d' 'a lista nira",
+ "apihelp-spamblacklist-description": "Valida uno o cchiù URL annanz' 'o SpamBlackList.",
+ "apihelp-spamblacklist-param-url": "URL pe' validà annanz' 'a lista nira.",
+ "apihelp-spamblacklist-example-1": "Cuntrolla ddoje URL nfacci' 'a lista nira"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/nb.json b/www/wiki/extensions/SpamBlacklist/i18n/nb.json
new file mode 100644
index 00000000..4d134851
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/nb.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jon Harald Søby"
+ ]
+ },
+ "spam-blacklist": " # Eksterne URL-er som finnes på denne lista vil ikke kunne legges til på en side.\n # Denne listen gjelder kun denne wikien; se også den globale svartelistinga.\n # For dokumentasjon, se https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- La denne linja være nøyaktig som den er --> <pre>\n#\n# Syntaksen er som følgende:\n# * Alle linjer som begynner med «#» er kommentarer\n# * Alle ikke-blanke linjer er et regex-fragment som kun vil passe med domenenavn i URL-er\n\n #</pre> <!-- la denne linja være nøyaktig som den er -->",
+ "spam-whitelist": " #<!-- la denne linja være nøyaktig som den er --> <pre>\n# Eksterne URL-er på denne lista vil *ikke* blokkeres, selv om\n# de ellers ville vært blokkert av svartelista.\n#\n# Syntaksen er som følger:\n# * Alle linjer som begynner med «#» er kommentarer\n# * Alle ikke-blanke linjer er et regex-fragment som kun vil passe med domenenavn i URL-er\n\n #</pre> <!-- la denne linja være nøyaktig som den er -->",
+ "email-blacklist": "# E-postadresser som matcher adresser på denne listen vil ikke kunne registrere seg eller sende e-post\n# Denne listen påvirker kun denne wikien; sjekk også den globale svartelista.\n# For dokumentasjon, se https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#<!-- la denne linja være som den er --> <pre>\n#\n# Syntaksen er som følger:\n# * Alt fra et «#»-tegn til sluttan av linje er kommentarer\n# * Hver ikke-blank linje er et regex-fragment som kun matcher domenenavn i e-postadresser\n\n#</pre> <!-- la denne linja være som den er -->",
+ "email-whitelist": "#<!-- la denne linja være som den er --> <pre>\n# E-postadresser som matcher denne listen vil *ikke* blokkeres selv om\n# de er blokkert av poster på svartelista.\n#\n#</pre> <!-- la denne linja være som den er -->\n# Syntaksen er som følger:\n# * Alt fra et «#»-tegn til slutten av linja er kommentarer\n# * Hver ikke-blank linje er et regex-fragment som kun matcher domener i e-postadresser",
+ "spam-blacklisted-email": "Svartelistede e-postadresser",
+ "spam-blacklisted-email-text": "E-postadressen din er svartelistes, så du kan ikke sende e-post til andre brukere.",
+ "spam-blacklisted-email-signup": "Den angitte e-postadressen er svartelistet.",
+ "spam-invalid-lines": "Følgende {{PLURAL:$1|linje|linjer}} i spamsvartelista er {{PLURAL:$1|et ugyldig regulært uttrykk|ugyldige regulære uttrykk}} og må rettes før lagring av siden:",
+ "spam-blacklist-desc": "Antispamverktøy basert på regulære uttrykk som gjør det mulig å svarteliste URL-er i sider og epostadresser for registrerte brukere",
+ "log-name-spamblacklist": "Spamfilterlogg",
+ "log-description-spamblacklist": "Disse hendelsene sporer treff på spamsvartelista.",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}} forårsaket et spamsvartelistetreff på $3 ved å prøve å legge til $4.",
+ "right-spamblacklistlog": "Vise spamfilterloggen",
+ "action-spamblacklistlog": "vise spamfilterloggen",
+ "apihelp-spamblacklist-description": "Valider én eller flere URL-er mot SpamBlacklist.",
+ "apihelp-spamblacklist-summary": "Valider én eller flere URL-er mot SpamBlacklist.",
+ "apihelp-spamblacklist-param-url": "URL-er som skal valideres mot svartelista.",
+ "apihelp-spamblacklist-example-1": "Sjekk to URL-er mot svartelista"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/nds.json b/www/wiki/extensions/SpamBlacklist/i18n/nds.json
new file mode 100644
index 00000000..8fb56f22
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/nds.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Slomox"
+ ]
+ },
+ "spam-blacklist": " # URLs na buten de Websteed in disse List stoppt dat Spiekern vun de Sied.\n # Disse List gellt blot för dit Wiki; kiek ok na de globale Swartlist.\n # För mehr Infos kiek op https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- Disse Reeg dröff nich ännert warrn! --> <pre>\n#\n# Syntax:\n# * Allens vun dat „#“-Teken af an bet to dat Enn vun de Reeg is en Kommentar\n# * Elkeen Reeg, de nich leddig is, is en regulären Utdruck, bi den nakeken warrt, wat he op de Host-Naams in de URLs passt\n\n #</pre> <!-- Disse Reeg dröff nich ännert warrn! -->",
+ "spam-whitelist": " #<!-- Disse Reeg dröff nich ännert warrn! --> <pre>\n# URLs na buten de Websteed in disse List stoppt dat Spiekern vun de Sied nich, ok wenn se\n# in de globale oder lokale swarte List in sünd.\n#\n# Syntax:\n# * Allens vun dat „#“-Teken af an bet to dat Enn vun de Reeg is en Kommentar\n# * Elkeen Reeg, de nich leddig is, is en regulären Utdruck, bi den nakeken warrt, wat he op de Host-Naams in de URLs passt\n\n #</pre> <!-- Disse Reeg dröff nich ännert warrn! -->",
+ "spam-invalid-lines": "Disse {{PLURAL:$1|Reeg|Regen}} in de Spam-Swartlist {{PLURAL:$1|is en ungülligen regulären Utdruck|sünd ungüllige reguläre Utdrück}}. De {{PLURAL:$1|mutt|mööt}} utbetert warrn, ehrdat de Sied spiekert warrn kann:",
+ "spam-blacklist-desc": "Regex-baseert Anti-Spam-Warktüüch: [[MediaWiki:Spam-blacklist]] un [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/nl-informal.json b/www/wiki/extensions/SpamBlacklist/i18n/nl-informal.json
new file mode 100644
index 00000000..a159d5d0
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/nl-informal.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Siebrand"
+ ]
+ },
+ "spam-blacklisted-email-text": "Je e-mailadres staat momenteel op de zwarte lijst waardoor je geen e-mails naar andere gebruikers kunt verzenden."
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/nl.json b/www/wiki/extensions/SpamBlacklist/i18n/nl.json
new file mode 100644
index 00000000..fd5a8a31
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/nl.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "SPQRobin",
+ "Siebrand"
+ ]
+ },
+ "spam-blacklist": " # Externe URL's die voldoen aan deze lijst worden geweigerd bij het\n # toevoegen aan een pagina. Deze lijst heeft alleen invloed op deze wiki.\n # Er bestaat ook een globale zwarte lijst.\n # Documentatie: https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- laat deze regel zoals hij is --> <pre>\n#\n# De syntaxis is als volgt:\n# * Alles vanaf het teken \"#\" tot het einde van de regel is opmerking\n# * Iedere niet-lege regel is een fragment van een reguliere uitdrukking die\n# alleen van toepassing is op hosts binnen URL's.\n\n #</pre> <!-- laat deze regel zoals hij is -->",
+ "spam-whitelist": " #<!-- laat deze regel zoals hij is --> <pre>\n# Externe URL's die voldoen aan deze lijst, worden *nooit* geweigerd, al\n# zouden ze geblokkeerd moeten worden door regels uit de zwarte lijst.\n#\n# De syntaxis is als volgt:\n# * Alles vanaf het teken \"#\" tot het einde van de regel is opmerking\n# * Iedere niet-lege regel is een fragment van een reguliere uitdrukking die\n# alleen van toepassing is op hosts binnen URL's.\n\n #</pre> <!-- laat deze regel zoals hij is -->",
+ "email-blacklist": " # E-mailadressen die voldoen aan deze lijst worden geblokkeerd bij het registreren of het verzenden van e-mails.\n # Deze lijst heeft alleen invloed op deze wiki. Er bestaat ook een globale zwarte lijst.\n # Documentatie: https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- laat deze regel zoals hij is --> <pre>\n#\n# De syntaxis is als volgt:\n# * Alles vanaf het teken \"#\" tot het einde van de regel is een opmerking\n# * Iedere niet-lege regel is een fragment van een reguliere uitdrukking die\n# alleen van toepassing is op hosts binnen e-mailadressen.\n\n #</pre> <!-- laat deze regel zoals hij is -->",
+ "email-whitelist": " #<!-- laat deze regel zoals hij is --> <pre>\n# E-mailadressen die voldoen aan deze lijst, worden *nooit* geweigerd, al\n# zouden ze geblokkeerd moeten worden door regels uit de zwarte lijst.\n#\n# De syntaxis is als volgt:\n# * Alles vanaf het teken \"#\" tot het einde van de regel is opmerking\n# * Iedere niet-lege regel is een fragment van een reguliere uitdrukking die\n# alleen van toepassing is op hosts binnen e-mailadressen.\n\n #</pre> <!-- laat deze regel zoals hij is -->",
+ "spam-blacklisted-email": "E-mailadres op de zwarte lijst",
+ "spam-blacklisted-email-text": "Uw e-mailadres staat momenteel op de zwarte lijst waardoor u geen e-mails naar andere gebruikers kunt verzenden.",
+ "spam-blacklisted-email-signup": "Het opgegeven e-mailadres staat momenteel op de zwarte lijst.",
+ "spam-invalid-lines": "De volgende {{PLURAL:$1|regel|regels}} van de zwarte lijst {{PLURAL:$1|is een|zijn}} onjuiste reguliere {{PLURAL:$1|expressie|expressies}} en {{PLURAL:$1|moet|moeten}} verbeterd worden alvorens de pagina kan worden opgeslagen:",
+ "spam-blacklist-desc": "Op reguliere expressies gebaseed antispamhulpprogramma dat het mogelijk maakt URL's in pagina's te blokkeren en e-mailadressen voor geblokkeerde gebruikers",
+ "log-name-spamblacklist": "Logboek zwarte lijst",
+ "log-description-spamblacklist": "Deze lijst bevat gebeurtenissen met betrekking tot de zwarte lijst.",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}} heeft geprobeerd $4 van de zwarte lijst toe te voegen op $3",
+ "right-spamblacklistlog": "Logboek zwarte lijst bekijken",
+ "action-spamblacklistlog": "logboek zwarte lijst te bekijken"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/nn.json b/www/wiki/extensions/SpamBlacklist/i18n/nn.json
new file mode 100644
index 00000000..c8123db5
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/nn.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Frokor"
+ ]
+ },
+ "spam-blacklist": " # Eksterne URL-ar som finnst på denne lista vil ikkje kunne leggast til på ei side.\n # Denne lista gjeld berre denne wikien; sjå òg den globale svartelistinga.\n # For dokumentasjon, sjå https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- La denne linja vere nøyaktig som ho er --> <pre>\n#\n# Syntaksen er som følgjer:\n# * Alle linjer som byrjar med «#» er kommentarar\n# * Alle ikkje-blanke linjer er eit regex-fragment som berre vil passe med domenenavn i URL-ar\n\n #</pre> <!-- la denne linja vere nøyaktig som ho er -->",
+ "spam-whitelist": " #<!-- la denne linja vere nøyaktig som ho er --> <pre>\n# Eksterne URL-ar på denne lista vil *ikkje* blokkerast, sjølv om\n# dei elles ville vorte blokkert av svartelista.\n#\n# Syntaksen er som følgjer:\n# * Alle linjer som byrjar med «#» er kommentarar\n# * Alle ikkje-blanke linjer er eit regex-fragment som berre vil passe med domenenamn i URL-ar\n\n #</pre> <!-- la denne linja vere nøyaktig som ho er -->",
+ "spam-invalid-lines": "Følgjande {{PLURAL:$1|linje|linjer}} i spamsvartelista er {{PLURAL:$1|eit ugyldig regulært uttrykk|ugyldige regulære uttrykk}} og må rettast før lagring av sida:",
+ "spam-blacklist-desc": "Antispamverktøy basert på regulære uttrykk: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/oc.json b/www/wiki/extensions/SpamBlacklist/i18n/oc.json
new file mode 100644
index 00000000..5600e701
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/oc.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Cedric31"
+ ]
+ },
+ "spam-blacklist": "# Los ligams extèrnes que fan partida d'aquesta lista seràn blocats al moment de lor insercion dins una pagina. # Aquesta lista concernís pas que Wikinews ; referissètz-vos tanben a la lista negra generala de Meta. # La documentacion se tròba a l’adreça seguenta : http://www.MediaWiki.org/wiki/Extension:SpamBlacklist # <!--Daissatz aquesta linha tala coma es --> <pre> # # La sintaxi es la seguenta # * Tot tèxte que seguís lo « # » es considerat coma un comentari. # * Tota linha pas voida es un fragment regex que concernís pas que los ligams ipertèxtes. #</pre> <!--Daissatz aquesta linha tala coma es -->",
+ "spam-whitelist": " #<!--Daissatz aquesta linha tala coma es --> <pre>\n# Los ligams extèrnes que fan partida d'aquesta lista seràn blocas al moment de lor insercion dins una pagina. \n# Aquesta lista concernís pas que Wikinews ; referissetz-vos tanben a la lista negra generala de Meta. \n # La documentacion se tròba a l’adreça seguenta : http://www.mediawiki.org/wiki/Extension:SpamBlacklist \n#\n# La sintaxi es la seguenta :\n# * Tot tèxte que seguís lo « # » es considerat coma un comentari.\n# * Tota linha pas voida es un fragment regex que concernís pas que los ligams ipertèxtes.\n\n #</pre> <!--Daissatz aquesta linha tala coma es -->",
+ "spam-invalid-lines": "{{PLURAL:$1|La linha seguenta |Las linhas seguentas}} de la lista dels spams {{PLURAL:$1|es redigida|son redigidas}} d'un biais incorrècte e {{PLURAL:$1|necessita|necessitan}} las correccions necessàrias abans tot salvament de la pagina :",
+ "spam-blacklist-desc": "Aisina antispam basada sus d'expressions regularas : ''[[MediaWiki:Spam-blacklist]]'' et ''[[MediaWiki:Spam-whitelist]]''"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/or.json b/www/wiki/extensions/SpamBlacklist/i18n/or.json
new file mode 100644
index 00000000..3572818b
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/or.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jnanaranjan Sahu",
+ "Psubhashish"
+ ]
+ },
+ "spam-blacklist": " # ଏକ ଫୃଷ୍ଠାରେ ଯୋଡ଼ାଯାଉଥିବା ବାହାର URL ଏହି ତାଲିକା ସହ ମେଳ ଖାଇଲେ ତାହାକୁ ଅଟକାଇଦିଆଯିବ ।\n # ଏହି ତାଲିକା କେବଳ କେବଳ ଏହି ଉଇକିକୁ ପ୍ରଭାବିତ କରିଥାଏ; ଜଗତ ଅଟକତାଲିକା ମଧ୍ୟ ଦେଖିପାରନ୍ତି ।\n # ଦଲିଲକରଣ ନିମନ୍ତେ ଦୟାକରି https://www.mediawiki.org/wiki/Extension:SpamBlacklist ଦେଖନ୍ତୁ ।\n #<!-- ଏହି ଧାଡ଼ିଟି ଯେଉଁପରି ଅଛି ଅବିକଳ ସେହିପରି ଛାଡ଼ି ଦିଅନ୍ତୁ --> <pre>\n#\n# ସିଣ୍ଟାକ୍ସ:\n# * \"#\" ଚିହ୍ନ ଠାରୁ ଧାଡ଼ିର ଶେଷ ଯାଏଁ ଏକ ମତ\n# * ସବୁ ଅଣ-ଖାଲି ଧାଡ଼ି ଏକ regex ଖଣ୍ଡ ଯାହା କେବଳ URL ଭିତରେ ଥିବା ହୋଷ୍ଟ ସହ ମେଳନ କରିଥାଏ\n\n #</pre> <!-- ଏହି ଧାଡ଼ିଟି ଯେଉଁପରି ଅଛି ଅବିକଳ ସେହିପରି ଛାଡ଼ି ଦିଅନ୍ତୁ -->",
+ "spam-whitelist": " #<!-- ଏହି ଧାଡ଼ିଟି ଯେଉଁପରି ଅଛି ଅବିକଳ ସେହିପରି ଛାଡ଼ି ଦିଅନ୍ତୁ --> <pre>\n# ଯଦି ସେସବୁ ଅଟକତାଲିକାରେ ଥାଏ ତେବେ ମଧ୍ୟ\n # ଏକ ଫୃଷ୍ଠାରେ ଯୋଡ଼ାଯାଉଥିବା ବାହାର URL ଏହି ତାଲିକା ସହ ମେଳ ଖାଉଥିଲେ ତାହାକୁ ଅଟକାଇ ଦିଆଯିବ *ନାହିଁ*\n#\n# ସିଣ୍ଟାକ୍ସ:\n# * \"#\" ଚିହ୍ନ ଠାରୁ ଧାଡ଼ିର ଶେଷ ଯାଏଁ ଏକ ମତ\n# * ସବୁ ଅଣ-ଖାଲି ଧାଡ଼ି ଏକ regex ଖଣ୍ଡ ଯାହା କେବଳ URL ଭିତରେ ଥିବା ହୋଷ୍ଟ ସହ ମେଳନ କରିଥାଏ\n\n #</pre> <!-- ଏହି ଧାଡ଼ିଟି ଯେଉଁପରି ଅଛି ଅବିକଳ ସେହିପରି ଛାଡ଼ି ଦିଅନ୍ତୁ -->",
+ "email-blacklist": " #<!-- ଏହି ଧାଡିଟି ଯେମିତି ଅଛି ସେମିତି ରଖନ୍ତୁ କିଛି ବଦଳାନ୍ତୁ ନାହିଁ --> <pre>\n# ଏହି ତାଲିକାରେ ଥିବା ଇ-ମେଲ ଠିକଣାଗୁଡିକୁ ପଞ୍ଜୀକରଣ କିମ୍ବା ଇ-ମେଲ ପଠେଇବାରୁ ଅଟକ ରଖାଯିବ\n# ଏହି ତାଲିକାଟି କେବଳ ଏହି ଉଇକିରେ କାର୍ଯ୍ୟକାରୀ ହେବ ; ଜାଗତିକ ଅଟକ ତାଲିକାକୁ ମଧ୍ୟ ଦେଖନ୍ତୁ ।\n# ନଥିପତ୍ର ପାଇଁ https://www.mediawiki.org/wiki/Extension:SpamBlacklist ଦେଖନ୍ତୁ\n#\n# ସିନ୍ଟାକ୍ସଟି ହେଉଛି:\n# * \"#\"ଠାରୁ ଆରମ୍ଭ କରି ଧାଡିର ଶେଷ ପର୍ଯ୍ୟନ୍ତ ସମସ୍ତ ଲେଖାଟି ହେଉଛି ଗୋଟେ ମନ୍ତବ୍ୟ\n# * ସମସ୍ତ ଖାଲିନଥିବା ଧାଡି ହେଉଛି ଏକ ରେଜେକ୍ସ ଫ୍ରାଗମେଣ୍ଟ ଯାହାକି ଇ-ମେଲ ଠିକଣାଗୁଡିକ ଭିତରେ ଥିବା ହୋଷ୍ଟଗୁଡିକ ସହ ମିଳେଇବ ।\n\n #</pre> <!-- ଏହି ଧାଡିଟି ଯେମିତି ଅଛି ସେମିତି ରଖନ୍ତୁ କିଛି ବଦଳାନ୍ତୁ ନାହିଁ -->",
+ "email-whitelist": " #<!-- ଏହି ଧାଡିଟି ଯେମିତି ଅଛି ସେମିତି ରଖନ୍ତୁ କିଛି ବଦଳାନ୍ତୁ ନାହିଁ --> <pre>\n# ଏହି ତାଲିକାରେ ଥିବା ଇ-ମେଲ ଠିକଣାଗୁଡିକୁ ଅଟକ ରଖାଯିବ *ନାହିଁ*\n# ଯଦିଓ ସେଗୁଡିକ ବାସନ୍ଦ ତାଲିକାରେ ଅଟକ ରଖାଯାଇଥିବ ।\n#\n# ସିନ୍ଟାକ୍ସଟି ହେଉଛି:\n# * \"#\"ଠାରୁ ଆରମ୍ଭ କରି ଧାଡିର ଶେଷ ପର୍ଯ୍ୟନ୍ତ ସମସ୍ତ ଲେଖାଟି ହେଉଛି ଗୋଟେ ମନ୍ତବ୍ୟ\n# * ସମସ୍ତ ଖାଲିନଥିବା ଧାଡି ହେଉଛି ଏକ ରେଜେକ୍ସ ଫ୍ରାଗମେଣ୍ଟ ଯାହାକି ଇ-ମେଲ ଠିକଣାଗୁଡିକ ଭିତରେ ଥିବା ହୋଷ୍ଟଗୁଡିକ ସହ ମିଳେଇବ ।\n\n #</pre> <!-- ଏହି ଧାଡିଟି ଯେମିତି ଅଛି ସେମିତି ରଖନ୍ତୁ କିଛି ବଦଳାନ୍ତୁ ନାହିଁ -->",
+ "spam-blacklisted-email": "ବନ୍ଦ କରାଯାଇଥିବା ଇ-ମେଲ ଠିକଣା",
+ "spam-blacklisted-email-text": "ଆପଣଙ୍କ ଇମେଲଟି ବାସନ୍ଦ କରାଯାଇଥିବାରୁ ବାକିମାନଙ୍କୁ ଇମେଲ ପଠାଇପାରିବେ ନାହିଁ ।",
+ "spam-blacklisted-email-signup": "ଦିଆଯାଇଥିବା ଇ-ମେଲ ଠିକଣାଟି ବ୍ୟବହାରକରିବାରୁ ବାସନ୍ଦ କରାଯାଇଛି ।",
+ "spam-invalid-lines": "ଏହି ସ୍ପାମ ଅଟକତାଲିକା {{PLURAL:$1|ଧାଡ଼ିଟି|ଧାଡ଼ିସବୁ}} ଅଚଳ ସାଧାରଣ {{PLURAL:$1|ପରିପ୍ରକାଶ|ପରିପ୍ରକାଶ}} ଓ ସାଇତିବା ଆଗରୁ {{PLURAL:$1|ତାହାକୁ ସୁଧାରିବା ଲୋଡ଼ା|ସେହିସବୁକୁ ସୁଧାରିବା ଲୋଡ଼ା}}:",
+ "spam-blacklist-desc": "Regex-ଭିତ୍ତିକ ସ୍ପାମ-ବିରୋଧୀ ଉପକରଣ: [[MediaWiki:Spam-blacklist]] ଓ [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/pl.json b/www/wiki/extensions/SpamBlacklist/i18n/pl.json
new file mode 100644
index 00000000..6d21068f
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/pl.json
@@ -0,0 +1,32 @@
+{
+ "@metadata": {
+ "authors": [
+ "BeginaFelicysym",
+ "Chrumps",
+ "Derbeth",
+ "Sp5uhe",
+ "WTM",
+ "Peter Bowman",
+ "Woytecr",
+ "Railfail536"
+ ]
+ },
+ "spam-blacklist": " #<!-- zostaw tę linię dokładnie tak, jak jest --> <pre>\n# Dodawanie w treści stron linków zewnętrznych pasujących do tej listy będzie blokowane.\n# Lista dotyczy wyłącznie tej wiki; istnieje też globalna czarna lista.\n# Dokumentacja znajduje się na stronie https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# Składnia jest następująca:\n# * Wszystko od znaku „#” do końca linii jest komentarzem\n# * Każda niepusta linia jest fragmentem wyrażenia regularnego, które będzie dopasowywane jedynie do hostów wewnątrz linków\n\n #</pre> <!-- zostaw tę linię dokładnie tak, jak jest -->",
+ "spam-whitelist": " #<!-- zostaw tę linię dokładnie tak, jak jest --> <pre>\n# Linki zewnętrzne pasujące do tej listy *nie będą* blokowane nawet jeśli\n# zostałyby zablokowane przez czarną listę.\n#\n# Składnia jest następująca:\n# * Wszystko od znaku „#” do końca linii jest komentarzem\n# * Każda niepusta linia jest fragmentem wyrażenia regularnego, które będzie dopasowywane jedynie do hostów wewnątrz linków\n\n #</pre> <!-- zostaw tę linię dokładnie tak, jak jest -->",
+ "email-blacklist": " # Adresy e-mail pasujące do tej listy będą blokowane przed rejestracją i wysyłaniem maili\n # Ta lista dotyczy tylko tej wiki; przejrzyj również globalną czarną listę.\n # Dokumentacja znajduje się na https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- leave this line exactly as it is --> <pre>\n#\n# Składnia opisana jest poniżej:\n# * Wszystko znajdujące się za znakiem \"#\" do końca linii jest komentarzem\n# * Każda niepusta linia jest fragmentem wyrażenia regularnego, które będzie dopasowywane do hosta z adresu e-mail\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "email-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# Adresy e-mail pasujące do tej listy *nie* będą blokowane, nawet jeśli zostaną\n# zablokowane przez wpisy z czarnej listy.\n#\n #</pre> <!-- leave this line exactly as it is -->\n# Składnia jest następująca:\n# * Wszystko począwszy od znaku \"#\" do końca linii jest komentarzem\n# * Każda niepusta linia jest fragmentem wyrażenia regularnego dopasowywanego tylko do nazw hpstów z adresów e-mail",
+ "spam-blacklisted-email": "Niedozwolone adresy e-mail",
+ "spam-blacklisted-email-text": "Twój adres e-mail jest obecnie umieszczony na czarnej liście i nie można z niego wysyłać wiadomości e-mail do innych użytkowników.",
+ "spam-blacklisted-email-signup": "Podany adres e-mail jest obecnie na czarnej liście blokującej przed użyciem.",
+ "spam-invalid-lines": "{{PLURAL:$1|Następująca linia jest niepoprawnym wyrażeniem regularnym i musi być poprawiona przed zapisaniem strony:|Następujące linie są niepoprawnymi wyrażeniami regularnymi i muszą być poprawione przed zapisaniem strony:}}",
+ "spam-blacklist-desc": "Narzędzie antyspamowe oparte o wyrażenia regularne pozwalające dodawać na czarną listę adresy URL na stronach i adresy e-mail użytkowników",
+ "log-name-spamblacklist": "Rejestr filtru antyspamowego",
+ "log-description-spamblacklist": "Te zdarzenia służą do śledzenia trafień czarnej listy spamu.",
+ "logentry-spamblacklist-hit": "$1 {{GENDER:$2|uruchomił|uruchomiła}} filtr antyspamowy na stronie $3, próbując dodać $4.",
+ "right-spamblacklistlog": "Podgląd rejestru czarnej listy spamu",
+ "action-spamblacklistlog": "przeglądania rejestru filtru antyspamowego",
+ "apihelp-spamblacklist-description": "Sprawdź jeden lub wiele URL pod kątem obecności na czarnej liście spamu.",
+ "apihelp-spamblacklist-summary": "Sprawdź jeden lub więcej adresów URL pod kątem obecności na liście spamu.",
+ "apihelp-spamblacklist-param-url": "URLe do sprawdzenia pod kątem obecności na czarnej liście.",
+ "apihelp-spamblacklist-example-1": "Sprawdź dwa URL pod kątem obecności na czarnej liście"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/pms.json b/www/wiki/extensions/SpamBlacklist/i18n/pms.json
new file mode 100644
index 00000000..0f1297ea
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/pms.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Borichèt",
+ "Bèrto 'd Sèra",
+ "Dragonòt"
+ ]
+ },
+ "spam-blacklist": "# J'adrësse esterne ch'as treuva ant sta lista-sì a vniran blocà se cheidun a jë gionta ansima a na pàgina. # Sta lista a l'ha valor mach an sta wiki-sì; ch'a-j fasa arferiment ëdcò a la lista nèira global. # Për dla documentassion ch'a varda http://www.MediaWiki.org/wiki/Extension:SpamBlacklist #<!-- ch'a lassa sta riga-sì giusta 'me ch'a l'é --> <pre> # # La sintassi a l'é: # * Tut lòn ch'as anandia con na \"#\" fin a la fin dla riga as ten coma coment # * Qualsëssìa riga nen veuja a resta un tòch d'espression regolar ch'as paragon-a a ij nòm ëd servent andrinta a j'adrësse #</pre> <!-- ch'a lassa sta riga-sì giusta 'me ch'a l'é -->",
+ "spam-whitelist": "#<!-- ch'a lassa sta riga-sì giusta 'me ch'a l'é --> <pre> # J'adrësse esterne coma cole dë sta lista a vniran NEN blocà, ëdcò fin-a # s'a fusso da bloché conforma a le régole dla lista nèira. # # La sintassi a l'é: # * Tut lòn ch'as anandia con na \"#\" fin a la fin dla riga as ten coma coment # * Qualsëssìa riga nen veuja a resta un tòch d'espression regolar ch'as paragon-a a ij nòm ëd servent andrinta a j'adrësse #</pre> <!-- ch'a lassa sta riga-sì giusta 'me ch'a l'é -->",
+ "email-blacklist": "# J'adrësse ëd pòsta eletrònica ch'as treuva ant sta lista-sì a vniran blocà da registresse o mandé 'd mëssagi. \n# Sta lista a l'ha valor mach an sta wiki-sì; ch'a-j fasa arferiment ëdcò a la lista nèira global. \n# Për dla documentassion ch'a varda http://www.mediawiki.org/wiki/Extension:SpamBlacklist \n#<!-- ch'a lassa sta riga-sì giusta 'me ch'a l'é --> <pre> \n# \n# La sintassi a l'é: \n# * Tut lòn ch'as anandia con na \"#\" fin a la fin dla riga as ten coma coment # \n* Qualsëssìa riga nen veujda a resta un tòch d'espression regolar ch'as paragon-a ai nòm dij servent andrinta a j'adrësse \n\n#</pre> <!-- ch'a lassa sta riga-sì giusta 'me ch'a l'é -->",
+ "email-whitelist": "#<!-- ch'a lassa sta riga-sì giusta 'me ch'a l'é --> <pre> \n# J'adrësse ëd pòsta eletrònica ch'as treuvo ant sta lista-sì a saran *pa* blocà bele ch'a sarìo\n# da bloché për le vos ëd la lista nèira.\n# \n#</pre> <!-- ch'a lassa sta riga-sì giusta 'me ch'a l'é -->\n# La sintassi a l'é: \n# * Tut lòn ch'as anandia con un «#» fin a la fin dla riga as ten coma coment \n# * Qualsëssìa riga nen veujda a resta un tòch d'espression regolar ch'as paragon-a ai nòm dij servent andrinta a j'adrësse",
+ "spam-blacklisted-email": "Adrëssa ëd pòsta eletrònica an lista nèira",
+ "spam-blacklisted-email-text": "Soa adrëssa ëd pòsta eletrònica a l'é al moment an na lista nèira për mandé dij mëssagi a j'àutri utent.",
+ "spam-blacklisted-email-signup": "L'adrëssa ëd pòsta eletrònica dàita a l'é al moment an na lista nèira për l'utilisassion.",
+ "spam-invalid-lines": "{{PLURAL:$1|St'|Sti}} element dla lista nèira dla rumenta ëd reclam a {{PLURAL:$1|l'é|son}} {{PLURAL:$1|n'|dj'}}espression regolar nen {{PLURAL:$1|bon-a|bon-e}} e a l'{{PLURAL:$1|ha|han}} da manca d'esse coregiùe anans che salvé la pàgina:",
+ "spam-blacklist-desc": "Utiss contra la rumenta basà su dj'espression regolar ch'a permëtto ëd buté an sla lista nèira dj'adrësse an sl'Aragnà ant le pàgine e dj'adrësse ëd pòsta eletrònica për j'utent argistrà.",
+ "log-name-spamblacklist": "Argistr dla lista nèira dla rumenta",
+ "log-description-spamblacklist": "Costi eveniment a marco le rëspondense con la lista nèira dla rumenta.",
+ "logentry-spamblacklist-hit": "$1 a l'ha causà na rëspondensa con la lista nèira dla rumenta su $3 an sërcand ëd gionté $4.",
+ "right-spamblacklistlog": "Smon-e l'argistr dla lista nèira dla rumenta",
+ "action-spamblacklistlog": "vëdde l'argistr dla lista nèira dla rumenta"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/pnb.json b/www/wiki/extensions/SpamBlacklist/i18n/pnb.json
new file mode 100644
index 00000000..1ef5047c
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/pnb.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Khalid Mahmood"
+ ]
+ },
+ "spam-blacklist": "# بارلے یو آر ایل جیہڑے ایس لسٹ نال رلدے ہون جدوں اوناں ایس صفے نال جوڑیا جاۓ گا تے اوناں نوں روک دتا جاؤکا۔\n# ایہ لسٹ صرف ایس وکی نال جڑی اے؛ جگت روکلسٹ نوں وی ویکھو۔\n# ڈوکومنٹیشن ل‏ی ویکھو https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n# <!-- ایس لین نوں اینج ای چھوڑ جنج اے ہے --> <pre>\n#\n# سینٹیکس ایہ اے:\n# * ہرشے \"#\" توںلے کے لین دے انت تک اک کومنٹ اے\n# * ہر ناں خالی لین اک ریجیکس فریگمنٹ اے جیہڑی یو آر ایل دے اندر ہوسٹو نال رلے گی۔\n\n#</pre> <!-- ایس لین نوں انج ای چھوڑ دیو جنج ایہ ہے -->",
+ "spam-whitelist": "# <!-- ایس لین نوں اینج ای چھوڑ جنج اے ہے --> <pre>\n# بارلے یو آر ایل جیہڑے ایس لسٹ نال رلدے ہون جدوں اوناں ایس صفے نال جوڑیا جاۓ گا تے اوناں نوں نئیں روکیا جاویگا پاویں اوناں نوں بلیکلسٹ انٹریز چ روکیا گیا ہووے۔\n#\n# سینٹیکس ایہ اے:\n# * ہرشے \"#\" توںلے کے لین دے انت تک اک کومنٹ اے\n# * ہر ناں خالی لین اک ریجیکس فریگمنٹ اے جیہڑی یو آر ایل دے اندر ہوسٹو نال رلے گی۔\n\n#</pre> <!-- ایس لین نوں انج ای چھوڑ دیو جنج ایہ ہے -->",
+ "spam-invalid-lines": "تھلے دتی گئی سپام کالیلسٹ {{PLURAL:$1|lلین|لیناں}} ناں منی جان والی ریگولر {{PLURAL:$1|ایکسپریشن|ایکسپریشناں}} تے {{PLURAL:$1|لوڑاں|لوڑ}} نوں ٹھیک کرنا ضروری صفہ بچان توں پہلے:",
+ "spam-blacklist-desc": "ریجیکس تے بنیا سپام ویری اوزار: [[MediaWiki:Spam-blacklist]] تے [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/pt-br.json b/www/wiki/extensions/SpamBlacklist/i18n/pt-br.json
new file mode 100644
index 00000000..c49f20c0
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/pt-br.json
@@ -0,0 +1,31 @@
+{
+ "@metadata": {
+ "authors": [
+ "Cainamarques",
+ "Eduardo.mps",
+ "Helder.wiki",
+ "Tuliouel",
+ "555",
+ "He7d3r",
+ "Felipe L. Ewald"
+ ]
+ },
+ "spam-blacklist": "#<!-- mantenha esta linha exatamente assim --> <pre>\n# URLs externas que coincidam com esta lista serão bloqueadas quando forem\n# adicionadas a uma página.\n# Esta lista refere-se apenas a este wiki. Consulte também a lista-negra global.\n# Veja a documentação em https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# A sintaxe é a seguinte:\n# * Tudo o que estiver após um \"#\" até o final de uma linha será tido como um comentário\n# * Todas as linhas que não estiverem em branco são um fragmento de expressão \n# regular (regex) que abrangem apenas a URL especificada\n\n #</pre> <!-- mantenha esta linha exatamente assim -->",
+ "spam-whitelist": "#<!-- mantenha esta linha exatamente assim --> <pre>\n # URLs externas que coincidam com esta lista *não* serão\n # bloqueadas mesmo se tiverem sido bloqueadas por entradas\n # presentes nas listas negras.\n #\n # A sintaxe é a seguinte:\n # * Tudo o que estiver após um \"#\" até o final de uma linha\n # será tido como um comentário\n # * Todas as linhas que não estiverem em branco são um\n # fragmento de expressão regular (regex) que abrangem apenas\n # a URL especificada\n\n #</pre> <!-- mantenha esta linha exatamente assim -->",
+ "email-blacklist": "#<!-- mantenha esta linha exatamente assim --> <pre>\n # Endereços de e-mail que coincidam com esta lista serão\n # impedidos de se registrar, bem como de enviar mensagens\n # Esta lista refere-se apenas a este wiki. Consulte também a lista negra global.\n # Veja a documentação em https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- mantenha esta linha exatamente assim --> <pre>\n #\n # A sintaxe é a seguinte:\n # * Tudo o que estiver após um \"#\" até o final de uma \n # linha será tido como um comentário\n # * Todas as linhas que não estiverem em branco são um\n # fragmento de expressão regular (regex) que abrangem apenas\n # o domínio do endereço de e-mail\n\n #</pre> <!-- mantenha esta linha exatamente assim -->",
+ "email-whitelist": "#<!-- mantenha esta linha exatamente assim --> <pre>\n # Endereços de e-mail que coincidam com esta lista *não*\n # serão bloqueados mesmo que tenham sofrido bloqueio\n # por instruções presentes nas listas negras.\n #\n # A sintaxe é a seguinte:\n # * Tudo o que estiver após um \"#\" até o final de uma linha\n # será tido como um comentário\n # * Todas as linhas que não estiverem em branco são um\n # fragmento de expressão regular (regex) que abrangem apenas\n # os domínios dos endereços de e-mail\n\n #</pre> <!-- mantenha esta linha exatamente assim -->",
+ "spam-blacklisted-email": "Endereço eletrônico na lista negra",
+ "spam-blacklisted-email-text": "O seu endereço de correio eletrônico está proibido de enviar mensagens para outros usuários.",
+ "spam-blacklisted-email-signup": "O endereço fornecido encontra-se na lista negra.",
+ "spam-invalid-lines": "{{PLURAL:$1|A linha|As linhas}} a seguir {{PLURAL:$1|é uma expressão regular|são expressões regulares}} (regex) {{PLURAL:$1|inválida e precisa|inválidas e precisam}} ser {{PLURAL:$1|corrigida|corrigidas}} antes de salvar a página:",
+ "spam-blacklist-desc": "Ferramenta anti-spam baseada em expressões regulares que permite adicionar URLs numa lista negra, barrando-os em páginas e também em emails enviados a usuários registrados",
+ "log-name-spamblacklist": "Registro da lista negra de spam",
+ "log-description-spamblacklist": "Esses eventos rastreiam hits na lista negra de spam.",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}} causou uma correspondência na lista negra de spam em $3, tentando adicionar $4.",
+ "right-spamblacklistlog": "Ver os registros da lista negra de spam",
+ "action-spamblacklistlog": "ver os registros da lista negra de spam",
+ "apihelp-spamblacklist-description": "Valide um ou mais URLs contra o SpamBlacklist.",
+ "apihelp-spamblacklist-summary": "Valide um ou mais URLs contra o SpamBlacklist.",
+ "apihelp-spamblacklist-param-url": "URLs para validar contra a lista negra.",
+ "apihelp-spamblacklist-example-1": "Verifique dois URLs contra a lista negra"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/pt.json b/www/wiki/extensions/SpamBlacklist/i18n/pt.json
new file mode 100644
index 00000000..c16a69e4
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/pt.json
@@ -0,0 +1,31 @@
+{
+ "@metadata": {
+ "authors": [
+ "Giro720",
+ "Hamilton Abreu",
+ "Helder.wiki",
+ "Malafaya",
+ "555",
+ "He7d3r",
+ "Fúlvio"
+ ]
+ },
+ "spam-blacklist": " #<!-- mantenha esta linha exatamente como ela está --> <pre>\n# Os URL externos que estejam nesta lista serão bloqueados quando adicionados a uma página.\n# Esta lista só afeta esta wiki; veja também a lista negra global.\n# Consulte a documentação em https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# A sintaxe é a seguinte:\n# * Tudo o que estiver entre um \"#\" e o final da linha é um comentário\n# * Todas as linhas que não estiverem em branco são um fragmento de expressão regular\n# (regex) que só pode coincidir com os \"hosts\" nos URL\n\n #</pre> <!-- mantenha esta linha exatamente como ela está -->",
+ "spam-whitelist": " #<!-- mantenha esta linha exatamente como ela está --> <pre>\n# Os URL externos que estejam nesta lista *não* serão bloqueados mesmo que normalmente\n# fossem bloqueados por entradas na lista negra.\n#\n# A sintaxe é a seguinte:\n# * Tudo o que estiver entre um \"#\" e o final da linha é um comentário\n# * Todas as linhas que não estiverem em branco são um fragmento de expressão regular\n# (regex) que só pode coincidir com os \"hosts\" nos URL\n\n #</pre> <!-- mantenha esta linha exatamente como ela está -->",
+ "email-blacklist": " #<!-- mantenha esta linha exatamente como ela está --> <pre>\n# Os endereços de correio eletrónico que estejam nesta lista serão impedidos de se registar\n# e de enviar correio eletrónico.\n# Esta lista só afeta esta wiki; veja também a lista negra global.\n# Consulte a documentação em https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# A sintaxe é a seguinte:\n# * Tudo o que estiver entre um \"#\" e o final da linha é um comentário\n# * Todas as linhas que não estiverem em branco são um fragmento de expressão regular\n# (regex) que só pode coincidir com os endereços de correio eletrónico\n\n #</pre> <!-- mantenha esta linha exatamente como ela está -->",
+ "email-whitelist": " #<!-- mantenha esta linha exatamente como ela está --> <pre>\n# Os endereços de correio eletrónico que estejam nesta lista *não* serão bloqueados\n# mesmo que normalmente fossem bloqueados por entradas na lista negra.\n#\n# A sintaxe é a seguinte:\n# * Tudo o que estiver entre um \"#\" e o final da linha é um comentário\n# * Todas as linhas que não estiverem em branco são um fragmento de expressão regular\n# (regex) que só pode coincidir com os endereços de correio eletrónico\n\n #</pre> <!-- mantenha esta linha exatamente como ela está -->",
+ "spam-blacklisted-email": "Endereço de correio eletrónico na lista negra",
+ "spam-blacklisted-email-text": "Atualmente o seu endereço de correio eletrónico está na lista negra que impede o envio de correio a outros utilizadores.",
+ "spam-blacklisted-email-signup": "O endereço de correio eletrónico fornecido não pode ser utilizado pois está na lista negra.",
+ "spam-invalid-lines": "{{PLURAL:$1|A entrada|As entradas}} abaixo {{PLURAL:$1|é uma expressão regular|são expressões regulares}} ''(regex)'' {{PLURAL:$1|inválida e precisa|inválidas e precisam}} de ser {{PLURAL:$1|corrigida|corrigidas}} antes de gravar a página:",
+ "spam-blacklist-desc": "Ferramenta anti-''spam'' baseada em ''regex'', que permite o barramento de endereços URL, impedindo que estes sejam colocados nas páginas, e de endereços de correio eletrónico, impedindo que utilizadores se registem com eles.",
+ "log-name-spamblacklist": "Registo da lista negra de ''spam''",
+ "log-description-spamblacklist": "Estes eventos registam as correspondências com a lista negra de ''spam''.",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}} causou correspondência com lista negra de spam na página \"$3\" ao tentar inserir $4.",
+ "right-spamblacklistlog": "Ver registos da lista negra de ''spam''",
+ "action-spamblacklistlog": "ver registos da lista negra de ''spam''",
+ "apihelp-spamblacklist-description": "Validar um ou mais URL contra a lista negra de ''spam''.",
+ "apihelp-spamblacklist-summary": "Validar um ou mais URL contra a lista negra de ''spam''.",
+ "apihelp-spamblacklist-param-url": "Os URL a validar contra a lista negra.",
+ "apihelp-spamblacklist-example-1": "Validar dois URL contra a lista negra"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/qqq.json b/www/wiki/extensions/SpamBlacklist/i18n/qqq.json
new file mode 100644
index 00000000..5d1eb787
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/qqq.json
@@ -0,0 +1,31 @@
+{
+ "@metadata": {
+ "authors": [
+ "Fryed-peach",
+ "Purodha",
+ "SPQRobin",
+ "Shirayuki",
+ "Siebrand",
+ "The Evil IP address",
+ "Umherirrender"
+ ]
+ },
+ "spam-blacklist": "See also: [[MediaWiki:spam-whitelist]] and [[MediaWiki:captcha-addurl-whitelist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
+ "spam-whitelist": "See also: [[MediaWiki:spam-blacklist]] and [[MediaWiki:captcha-addurl-whitelist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
+ "email-blacklist": "See also: [[MediaWiki:email-whitelist]] and [[MediaWiki:Spam-blacklist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
+ "email-whitelist": "See also: [[MediaWiki:email-blacklist]] and [[MediaWiki:Spam-whitelist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
+ "spam-blacklisted-email": "Title of errorpage when trying to send an email with a blacklisted e-mail address",
+ "spam-blacklisted-email-text": "Text of errorpage when trying to send an e-mail with a blacklisted e-mail address",
+ "spam-blacklisted-email-signup": "Error when trying to create an account with an invalid e-mail address",
+ "spam-invalid-lines": "Used as an error message.\n\nThis message is followed by a list of bad lines.\n\nParameters:\n* $1 - the number of bad lines",
+ "spam-blacklist-desc": "{{desc|name=Spam Blacklist|url=https://www.mediawiki.org/wiki/Extension:SpamBlacklist}}",
+ "log-name-spamblacklist": "Name of log that appears on [[Special:Log]].",
+ "log-description-spamblacklist": "Description of spam blacklist log",
+ "logentry-spamblacklist-hit": "Log entry that is created when a user adds a link that is blacklisted on the spam blacklist.\n\n{{logentry}}\nAdditional parameters:\n* $4 - the URL the user tried to add",
+ "right-spamblacklistlog": "{{doc-right|spamblacklistlog}}",
+ "action-spamblacklistlog": "{{doc-action|spamblacklistlog}}",
+ "apihelp-spamblacklist-description": "{{doc-apihelp-description|spamblacklist}}",
+ "apihelp-spamblacklist-summary": "{{doc-apihelp-summary|spamblacklist}}",
+ "apihelp-spamblacklist-param-url": "{{doc-apihelp-param|spamblacklist|url}}",
+ "apihelp-spamblacklist-example-1": "{{doc-apihelp-example|spamblacklist}}"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/rm.json b/www/wiki/extensions/SpamBlacklist/i18n/rm.json
new file mode 100644
index 00000000..93039f05
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/rm.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kazu89"
+ ]
+ },
+ "log-name-spamblacklist": "Protocol da la glista naira da spam"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/ro.json b/www/wiki/extensions/SpamBlacklist/i18n/ro.json
new file mode 100644
index 00000000..39a26449
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/ro.json
@@ -0,0 +1,18 @@
+{
+ "@metadata": {
+ "authors": [
+ "Firilacroco",
+ "Minisarm"
+ ]
+ },
+ "spam-blacklisted-email": "Adresă de e-mail inclusă în lista neagră",
+ "spam-blacklisted-email-text": "Adresa dumneavoastră de e-mail este actualmente inclusă în lista neagră, neputând expedia e-mailuri altor utilizatori.",
+ "spam-blacklisted-email-signup": "Adresa de e-mail specificată este actualmente inclusă în lista neagră, neputând fi utilizată.",
+ "spam-invalid-lines": "{{PLURAL:$1|Următorul rând|Următoarele rânduri}} din lista neagră de spam {{PLURAL:$1|este|sunt}} {{PLURAL:$1|o expresie regulată invalidă|expresii regulate invalide}} și trebuie {{PLURAL:$1|corectat|corectate}} înainte de a salva pagina:",
+ "spam-blacklist-desc": "Unealtă antispam bazată pe regex care permite includerea adreselor URL introduse în pagini și a adreselor de e-mail ale utilizatorilor înregistrați în lista neagră",
+ "log-name-spamblacklist": "Jurnal listă neagră spam",
+ "log-description-spamblacklist": "Aceste evenimente urmăresc declanșarea listei negre de spam.",
+ "logentry-spamblacklist-hit": "$1 a provocat declanșarea listei negre de spam în pagina $3, încercând să adauge $4.",
+ "right-spamblacklistlog": "Vizualizează jurnalul listei negre de spam",
+ "action-spamblacklistlog": "vizualizați jurnalul listei negre de spam"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/roa-tara.json b/www/wiki/extensions/SpamBlacklist/i18n/roa-tara.json
new file mode 100644
index 00000000..c0f63cc3
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/roa-tara.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Joetaras"
+ ]
+ },
+ "spam-blacklist": " # Le URL esterne ca se iacchiane jndr'à st'elenghe avènene bloccate quanne avènene aggiunde jndr'à 'na pàgene.\n # St'elenghe tène effette sulamende sus a sta Uicchi; se pò refèrì pure a 'a lista gnore globale.\n # Pe documendazione vide https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- leave this line exactly as it is --> <pre>\n#\n# 'A sindasse jè a cumme segue:\n# * Ognecose ca tène 'u carattere \"#\" 'mbonde a fine d'a linèe jè 'nu commende\n# * Ogne linèe ca non g'è vacande jè 'nu frammende de regex ca vè face le combronde cu le host jndr'à l'URL\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n # Le URL esterne ca se iacchiane jndr'à st'elenghe *non* g'avènene bloccate pure ca lore sonde mise \n # jndr'à l'elenghe d'a lista gnore.\n #\n\n#\n# 'A sindasse jè a cumme segue:\n# * Ognecose ca tène 'u carattere \"#\" 'mbonde a fine d'a linèe jè 'nu commende\n# * Ogne linèe ca non g'è vacande jè 'nu frammende de regex ca vè face le combronde cu le host jndr'à l'URL\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "email-blacklist": " #<!-- leave this line exactly as it is --> <pre>\n# Le indirizze email ca iessene jndr'à ste elenghe onna essere bloccate da 'a reggistrazzione e da mannà le email\n# Ste elenghe tène cunde sole de sta uicchi; referite pure a 'a lista gnore globbale.\n# Pe documendazione 'ndruche https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# 'A sindasse jè 'a seguende:\n# * Ognecose ca tène 'u carattere \"#\" 'mbonde a fine d'a linèe jè 'nu commende\n# * Ogne linèe ca non g'è vacande jè 'nu frammende de regex ca vè face le combronde cu le host jndr'à le indirizze email\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "email-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# Le indirizze email ca iessene jndr'à ste elenghe *NON* ge onna essere bloccate pure ce lore ponne sta jndr'à le vôsce d'a lista gnore\n#\n# 'A sindasse jè 'a seguende:\n# * Ognecose ca tène 'u carattere \"#\" 'mbonde a fine d'a linèe jè 'nu commende\n# * Ogne linèe ca non g'è vacande jè 'nu frammende de regex ca vè face le combronde cu le host jndr'à le indirizze email\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-blacklisted-email": "Indirizze email da ignorà",
+ "spam-blacklisted-email-text": "L'indirizze email tune jè mo jndr'à lista gnore pe mannà email a otre utinde.",
+ "spam-blacklisted-email-signup": "L'indirizze email ca è date pe mò ste jndr'à lista gnore.",
+ "spam-invalid-lines": "{{PLURAL:$1|'A seguende linèe d'a blacklist de spam jè|Le seguende linèe d'a blacklist de spam sonde}} {{PLURAL:$1|espressione|espressiune}} regolare invalide e {{PLURAL:$1|abbesogne|abbesognane}} de avenè corrette apprime de reggistrà 'a pàgene:",
+ "spam-blacklist-desc": "'U strumende andi-spam basate sus a le regex ca dèje le URL de le pàggene de l'elenghe gnure e le indirizze email de le utinde reggistrate",
+ "log-name-spamblacklist": "Archivije de l'elenghe gnure de le rummate",
+ "log-description-spamblacklist": "Ste evende tracciane le trasute jndr'à l'elenghe gnure de le rummate.",
+ "logentry-spamblacklist-hit": "$1 ave fatte 'na trasute jndr'à l'elenghe gnure de le rummate sus a $3 pruvanne a aggiungere $4.",
+ "right-spamblacklistlog": "'Ndruche l'archivije de l'elenghe gnure de le rummate",
+ "action-spamblacklistlog": "'ndruche l'archivije de l'elenghe gnure d'u rummate",
+ "apihelp-spamblacklist-description": "Valide une o cchiù URL condre 'a SpamBlackList.",
+ "apihelp-spamblacklist-summary": "Valide une o cchiù URL cu 'a SpamBlackList.",
+ "apihelp-spamblacklist-param-url": "URL da validà condre 'a lista gnore.",
+ "apihelp-spamblacklist-example-1": "Verifiche doje URL condre 'a lista gnore"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/ru.json b/www/wiki/extensions/SpamBlacklist/i18n/ru.json
new file mode 100644
index 00000000..a2ae9934
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/ru.json
@@ -0,0 +1,33 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ahonc",
+ "Amire80",
+ "Express2000",
+ "HalanTul",
+ "Kaganer",
+ "NBS",
+ "Okras",
+ "Александр Сигачёв",
+ "INS Pirat"
+ ]
+ },
+ "spam-blacklist": " #<!-- не изменяйте эту строку --> <pre>\n# Внешние ссылки, соответствующие этому списку, будут запрещены для внесения на страницы.\n# Этот список действует только для данной вики, существует также общий чёрный список.\n# Подробнее на странице https://www.mediawiki.org/wiki/Extension:SpamBlacklist#\n# Синтаксис:\n# * Всё, начиная с символа \"#\" и до конца строки, считается комментарием\n# * Каждая непустая строка - фрагмент регулярного выражения, применяемого только к узлу в URL\n\n #</pre> <!-- не изменяйте эту строку -->",
+ "spam-whitelist": " #<!-- не изменяйте эту строку --> <pre>\n# Внешние ссылки, соответствующие этому списку, *не* будут блокироваться, даже если они попали в чёрный список.\n#\n# Синтаксис:\n# * Всё, начиная с символа \"#\" и до конца строки, считается комментарием.\n# * Каждая непустая строка — это фрагмент регулярного выражения, применяемого только к узлу в URL.\n\n #</pre> <!-- не изменяйте эту строку -->",
+ "email-blacklist": " #<!-- не изменяйте эту строку --> <pre>\n# Адреса электронной почты, соответствующие этому списку, будут заблокированы от регистрации или посылки эл. почты.\n# Этот список действует только для данной вики, существует также общий чёрный список.\n# Подробнее на странице https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# Синтаксис:\n# * Всё, начиная с символа \"#\" и до конца строки, считается комментарием\n# * Каждая непустая строка - фрагмент регулярного выражения, применяемого только к узлам внутри адресов эл. почты\n\n #</pre> <!-- не изменяйте эту строку -->",
+ "email-whitelist": " #<!-- не изменяйте эту строку --> <pre>\n# Адреса электронной почты, соответствующие этому списку, НЕ БУДУТ заблокированы,\n# даже если они внесены в черный список.\n#\n# Синтаксис:\n# * Всё, начиная с символа \"#\" и до конца строки, считается комментарием.\n# * Каждая непустая строка — фрагмент регулярного выражения, применяемого только к узлам внутри адресов эл. почты.\n #</pre> <!-- не изменяйте эту строку -->",
+ "spam-blacklisted-email": "Адреса электронной почты, занесённые в чёрный список",
+ "spam-blacklisted-email-text": "Ваш адрес электронной почты в настоящее время находится в чёрном списке, поэтому вы не можете отправлять сообщения другим пользователям.",
+ "spam-blacklisted-email-signup": "Указанный адрес электронной почты в настоящее время занесён в чёрный список и не может быть использован.",
+ "spam-invalid-lines": "{{PLURAL:$1|1=Следующая строка чёрного списка ссылок содержит ошибочное регулярное выражение и должна быть исправлена|Следующие строки чёрного списка ссылок содержат ошибочные регулярные выражения и должны быть исправлены}} перед сохранением:",
+ "spam-blacklist-desc": "Основанный на регулярных выражениях анти-спам инструмент позволяет добавлять в чёрный список URL на страницах и адреса электронной почты для зарегистрированных пользователей",
+ "log-name-spamblacklist": "Журнал спам-листа",
+ "log-description-spamblacklist": "Это журнал, отслеживающий срабатывание спам-листа.",
+ "logentry-spamblacklist-hit": "$1 вызвал срабатывание спам-листа на странице $3 из-за попытки добавить $4.",
+ "right-spamblacklistlog": "просмотр журнала спам-листа",
+ "action-spamblacklistlog": "просмотр журнала спам-листа",
+ "apihelp-spamblacklist-description": "Проверить один или несколько URL-адресов с помощью SpamBlacklist.",
+ "apihelp-spamblacklist-summary": "Проверить один или несколько URL-адресов с помощью SpamBlacklist.",
+ "apihelp-spamblacklist-param-url": "URL-адреса для проверки в чёрном списке.",
+ "apihelp-spamblacklist-example-1": "Проверить два URL-адреса по чёрному списку"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/rue.json b/www/wiki/extensions/SpamBlacklist/i18n/rue.json
new file mode 100644
index 00000000..50297a6c
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/rue.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Gazeb"
+ ]
+ },
+ "spam-blacklist": " # Екстерны URL одповідаючі тому списку будуть заблокованы при пробі придати їх на сторінку.\n # Тот список овпливнює лем тоту вікі; посмотьте ся тыж на ґлоналну чорну листину.\n # Документацію найдете на https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- Охабте тот рядок точно як є --> <pre>\n#\n# Сінтаксіс є наступный:\n# * Вшытко од знаку „#“ до кінце рядку є коментарь\n# * Каждый непорожній рядок є часть реґуларного выразу, котрому будуть одповідати лем домены з URL\n\n #</pre> <!-- Охабте тот рядок точно як є -->",
+ "spam-whitelist": " #<!-- Охабте тот рядок точно як є --> <pre>\n# Екстерны URL одповідаючі выразам у тім списку *не будуть* заблокованы, ані кобы\n# їх заблоковали положкы з чорной листины.\n#\n# Сінтаксіс є наступна:\n# * Вшытко од знаку „#“ до кінце рядку є коментарь\n# * каждый непорожній рядок є часть реґуларного выразу, котрому будурь одповідати лем домены з URL\n\n #</pre> <!-- Охабте тот рядок точно як є -->",
+ "email-blacklist": " # З імейлів одповідных гевсёму списку не буде годен зареґістровати ни конто ни послати імейл.\n # Гевсесь список мать вплыв лем на гевсю вікі; посмотьте тыж ґлобалных чорный список.\n # Документацію найдете на https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- тот рядок охабте актуално так як він є теперь --> <pre>\n#\n# Сінтакс є в наступных рядках:\n# * Вшытко од сімвола „#“ до кінце рядка є коментарь\n# * Каждый непорожнїй рядок є часть реґуларного выразу, котрому будуть одповідати лем домены в імейловых адресах\n\n #</pre> <!-- тот рядок охабте актуално так як він є теперь -->",
+ "email-whitelist": " #<!-- тот рядок охабте актуално так як він є теперь --> <pre>\n# Імейлы одповідны тому списку *не будуть* заблокованы, хоць бы\n# одповідали записам в чорнім списку.\n#\n# Сінтакс є в наступныха рядках:\n# * Вшытко од сімвола „#“ до кінце рядка є коментарь\n# * Каждый непорожнїй рядок є часть реґуларного выразу, котрому будуть одповідати лем домены в імейловых адресах\n #</pre> <!-- тот рядок охабте актуално так як він є теперь -->",
+ "spam-blacklisted-email": "Імейл на чорнім списку",
+ "spam-blacklisted-email-text": "Ваша імейлова адреса є моментално уведжена на чорнім списку, та же другым хоснователям не можете послати імейл.",
+ "spam-blacklisted-email-signup": "Уведжена імейлова адреса є моментално на чорнім списку.",
+ "spam-invalid-lines": "На чорній листинї спаму {{PLURAL:$1|є наступный рядок неправилный реґуларный выраз|суть наступны рядкы неправилны реґуларны выразы|суть наступны рядкы неправилны реґуларны выразы}} і є треба {{PLURAL:$1|го|їх|їх}} перед уложінём сторінкы справити:",
+ "spam-blacklist-desc": "Антіспамовый інштрумент на базї реґуларных выразів: [[MediaWiki:Spam-blacklist]] і [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/sa.json b/www/wiki/extensions/SpamBlacklist/i18n/sa.json
new file mode 100644
index 00000000..454a56ad
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/sa.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "Shubha",
+ "NehalDaveND"
+ ]
+ },
+ "spam-blacklist": " #सूच्यां विद्यमानानां सदृशानि बाह्य URLs अवरुद्धानि भवन्ति यदा पृष्ठं योज्यते ।\n #एषा सूची अस्यां वीक्यां प्रभावकारिणी अस्ति; वैश्विकदुरुपयुक्तावल्याः कृते अपि आन्वितं भवति ।\n #प्रलेखनाय दृश्यताम् https://www.mediawiki.org/wiki/Extension:SpamBlacklist \n #<!-- leave this line exactly as it is --> <pre>\n#\n#विन्यासः एवं विद्यते :\n# * \"#\" तः आरभ्यमाणाः पङ्क्तेः अन्त्यपर्यन्तं विद्यमानः अभिप्रायः भवति ।\n# * प्रत्येकं रिक्तरहिता पंक्तिः regex fragment भवति यत् URLs अन्तर्गतैः आयोजकैः तुल्यते\n #</pre> <!-- इयं पङ्क्ती यथावत् त्यज्यताम् -->",
+ "spam-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n#अस्यां सूच्यां विद्यमानानां सदृशानि URLs *न* अवरुद्ध्यन्ते यद्यपि शक्यम्\n# दुरुपयुक्तप्रवेशैः अवरुद्धमस्ति ।\n#\n #</pre> <!-- leave this line exactly as it is -->",
+ "email-blacklist": " #सूच्यां विद्यमानानां सदृशाः बाह्य ईपत्रसङ्केताः पञ्जीकरणात् ईपत्रप्रेषणात् च अवरुद्धाः भवन्ति \n #एषा सूची अस्यां वीक्यां प्रभावकारिणी अस्ति; वैश्विकदुरुपयुक्तावल्याः कृते अपि आन्वितं भवति ।\n #प्रलेखनाय दृश्यताम् https://www.mediawiki.org/wiki/Extension:SpamBlacklist \n #<!-- leave this line exactly as it is --> <pre>\n#\n#विन्यासः एवं विद्यते :\n# * \"#\" तः आरभ्यमाणाः पङ्क्तेः अन्त्यपर्यन्तं विद्यमानः अभिप्रायः भवति ।\n# * प्रत्येकं रिक्तरहिता पंक्तिः regex fragment भवति यत् URLs अन्तर्गतैः आयोजकैः तुल्यते\n #</pre> <!-- इयं पङ्क्ती यथावत् त्यज्यताम् -->",
+ "email-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n#अस्यां सूच्यां विद्यमानानां सदृशाः ईपत्रसङ्केताः *न* अवरुद्ध्यन्ते यद्यपि शक्यम्\n# दुरुपयुक्तप्रवेशैः अवरुद्धमस्ति ।\n#\n #</pre> <!-- leave this line exactly as it is -->\n# विन्यासः एवं भवेत्:\n# * \"#\" तः आरभ्यमाणं वाक्यान्तपर्यन्तं विद्यमानम् अभिप्रायः मन्यते \n# * सर्वाः रिक्तरहिताः पङ्क्तयः regex fragment भवति ये ईपत्रसङ्केतान्तर्गतेन अंशेन तुल्यन्ते",
+ "spam-blacklisted-email": "निन्द्यः वि-पत्रसङ्केतः",
+ "spam-blacklisted-email-text": "भवतः वि-पत्रसङ्केतः सम्प्रति निन्द्यसङ्केतानाम् आवल्यां प्रवेशितः । अतः अन्येभ्यः सदस्येभ्यः वि-पत्रप्रेषणं नानुमन्यते ।",
+ "spam-blacklisted-email-signup": "प्रदत्तः निन्द्यः वि-पत्रसङ्केतः सम्प्रति उपयोगे नास्ति ।",
+ "spam-invalid-lines": "अधोनिर्दिष्टाः अनिष्टसन्देशदुर्वृत्तयः {{PLURAL:$1|पंक्तिः|पंक्तियः}} अमान्याः नियताः {{PLURAL:$1|अभिव्यक्तिः अस्ति|अभिव्यक्तयः सन्ति}} अतः पृष्ठरक्षणात् पूर्वं तेषां परिष्कारः अवश्यं कर्तव्याः :",
+ "spam-blacklist-desc": "रेजेक्स्-आधारितम् अनिष्टसन्देशविरोधि उपकरणम्: [[MediaWiki:Spam-blacklist]] [[MediaWiki:Spam-whitelist]] च"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/sah.json b/www/wiki/extensions/SpamBlacklist/i18n/sah.json
new file mode 100644
index 00000000..d72dd4e2
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/sah.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "HalanTul",
+ "Kaganer"
+ ]
+ },
+ "spam-blacklist": " # Бу испииһэккэ баар тас сигэлэр бобуллуохтара.\n # Бу испииһэк бу эрэ бырайыакка үлэлиир, уопсай ''хара испииһэк'' эмиэ баарын умнума.\n # Сиһилии манна көр https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- бу строканы уларытыма --> <pre>\n#\n# Синтаксис:\n# * Бу \"#\" бэлиэттэн саҕалаан строка бүтүөр дылы барыта хос быһаарыыннан ааҕыллар\n# * Каждая непустая строка является фрагментом регулярного выражения, применяемого только к узлу в URL\n\n #</pre> <!-- бу строканы уларытыма -->",
+ "spam-whitelist": " #<!-- бу строканы уларытыма --> <pre>\n# Манна киирбит тас сигэлэр хара испииһэккэ киирбит да буоллахтарына син биир *бобуллуохтара суоҕа*.\n#\n# Синтаксис:\n# * Бу \"#\" бэлиэттэн саҕалаан строка бүтүөр дылы барыта хос быһаарыыннан ааҕыллар\n# * Каждая непустая строка — фрагмент регулярного выражения, применяемого только к узлу в URL\n\n #</pre> <!-- бу строканы уларытыма -->",
+ "spam-invalid-lines": "Хара испииһэк манна көрдөрүллүбүт {{PLURAL:$1|строкаата сыыһалаах|строкаалара сыыһалаахтар}}, уларытыах иннинэ ол көннөрүллүөхтээх:",
+ "spam-blacklist-desc": "Анти-спам үстүрүмүөнэ: [[MediaWiki:Spam-blacklist]] уонна [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/scn.json b/www/wiki/extensions/SpamBlacklist/i18n/scn.json
new file mode 100644
index 00000000..44947ed2
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/scn.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Santu",
+ "Pippinu",
+ "Sarvaturi"
+ ]
+ },
+ "spam-blacklist": " # Li URL fora dû sito ca currispùnnunu a la lista di sècutu vènunu bluccati.\n # La lista vali sulu pi stu situ; fari rifirimentu macari a la blacklist glubbali.\n # Pâ ducumentazzioni talìa https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- nun mudificari pi nenti chista riga --> <pre>\n# La sintassi è chista:\n# * Tuttu chiddu ca veni doppu nu caràttiri \"#\" è nu cummentu, nzinu ca finisci la riga\n# * Tutti li righi non vacanti sunnu frammenti di sprissioni riulari ca s'àpplicanu sulu ô nomu di l'host nti li URL\n #</pre> <!-- non mudificari nenti di sta riga -->",
+ "spam-whitelist": " #<!-- non mudificari nta nudda manera sta riga --> <pre>\n# Li URL fora ô situ ca currispùnninu a la lista ccà di sècutu *non* vèninu\n# bluccati, macari ntô casu avìssiru a currispùnniri a arcuni vuci di la blacklist\n#\n# La sintassi è chista:\n# * Tuttu chiddu ca veni doppu un caràttiri \"#\" è nu cummentu, nzinu a la fini dâ riga\n# * Tutti li righi non vacanti sunnu frammenti di sprissioni riulari ca s'applìcanu sulu ô nomu di l'host ntê URL\n\n #</pre> <!-- non mudificari nta nudda manera sta riga -->",
+ "spam-invalid-lines": "{{PLURAL:$1|La riga di sècutu|Li righi di sècutu}} di la blacklist dô spam {{PLURAL:$1|nun è na sprissioni riulari boni|nun sunnu sprissioni riulari boni}}; currèggiri {{PLURAL:$1|lu sbagghiu|li sbagghi}} prima di sarvari la pàggina.",
+ "spam-blacklist-desc": "Strummentu anti-spam basatu supra ê sprissioni riulari chi cunzenti di mèttiri ntâ lista nìura l'URL nta pàggini e nnirizzi di posta elittrònica di l'utenti riggistrati"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/sco.json b/www/wiki/extensions/SpamBlacklist/i18n/sco.json
new file mode 100644
index 00000000..8b1a5173
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/sco.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "John Reid"
+ ]
+ },
+ "right-spamblacklistlog": "See the spam blaickleet log"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/si.json b/www/wiki/extensions/SpamBlacklist/i18n/si.json
new file mode 100644
index 00000000..12a69957
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/si.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Budhajeewa",
+ "පසිඳු කාවින්ද"
+ ]
+ },
+ "spam-blacklist": " # External URLs matching this list will be blocked when added to a page.\n # This list affects only this wiki; refer also to the global blacklist.\n # For documentation see https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- leave this line exactly as it is --> <pre>\n#\n# Syntax is as follows:\n# * Everything from a \"#\" character to the end of the line is a comment\n# * Every non-blank line is a regex fragment which will only match hosts inside URLs\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# External URLs matching this list will *not* be blocked even if they would\n# have been blocked by blacklist entries.\n#\n# Syntax is as follows:\n# * Everything from a \"#\" character to the end of the line is a comment\n# * Every non-blank line is a regex fragment which will only match hosts inside URLs\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-blacklisted-email": "අපලේඛනගත විද්‍යුත්-තැපැල් ලිපින",
+ "spam-invalid-lines": "පහත දැක්වෙන කළු ලයිස්තු {{PLURAL:$1|පේලිය|පේලි}} වැරදි regular {{PLURAL:$1|expression|expressions}} වන අතර, පිටුව සුරැකීමට පෙර නිවැරදි කළ යුතුය:",
+ "spam-blacklist-desc": "Regex-පාදක ප්‍රති-ස්පෑම ආවුදය: [[MediaWiki:Spam-blacklist]] සහ [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/sk.json b/www/wiki/extensions/SpamBlacklist/i18n/sk.json
new file mode 100644
index 00000000..571010b7
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/sk.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Helix84"
+ ]
+ },
+ "spam-blacklist": "# Externé URLs zodpovedajúce tomuto zoznamu budú zablokované pri pokuse pridať ich na stránku.\n# Tento zoznam ovplyvňuje iba túto wiki; pozrite sa tiež na globálnu čiernu listinu.\n # Dokumentáciu nájdete na https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#<!-- nechajte tento riadok presne ako je --> <pre>\n#\n# Syntax je nasledovná:\n# * Všetko od znaku „#“ do konca riadka je komentár\n# * Každý neprázdny riadok je časť regulárneho výrazu, ktorému budú zodpovedať iba domény z URL\n\n#</pre> <!-- nechajte tento riadok presne ako je -->",
+ "spam-whitelist": " #<!-- leave this line exactly as it is --> <pre> \n# Externé URL zodpovedajúce výrazom v tomto zozname *nebudú* zablokované, ani keby\n# ich zablokovali položky z čiernej listiny.\n#\n# Syntax je nasledovná:\n# * Všetko od znaku \"#\" do konca riadka je komentár\n# * Každý neprázdny riadok je regulárny výraz, podľa ktorého sa budú kontrolovať názvy domén\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-invalid-lines": "{{PLURAL:$1|Nasledovný riadok|Nasledovné riadky}} čiernej listiny spamu {{PLURAL:$1|je neplatný regulárny výraz|sú neplatné regulárne výrazy}} a je potrebné {{PLURAL:$1|ho|ich}} opraviť pred uložením stránky:",
+ "spam-blacklist-desc": "Antispamový nástroj na základe regulárnych výrazov: [[MediaWiki:Spam-blacklist|Čierna listina]] a [[MediaWiki:Spam-whitelist|Biela listina]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/sl.json b/www/wiki/extensions/SpamBlacklist/i18n/sl.json
new file mode 100644
index 00000000..c2d62603
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/sl.json
@@ -0,0 +1,26 @@
+{
+ "@metadata": {
+ "authors": [
+ "Dbc334",
+ "Eleassar",
+ "Yerpo"
+ ]
+ },
+ "spam-blacklist": " # Zunanji URL-ji, ki se ujemajo s tem seznamom, bodo blokirani, ko bodo dodani na stran.\n # Seznam vpliva samo na ta wiki; oglejte si tudi globalni črni seznam.\n # Za dokumentacijo si oglejte https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- pustite to vrstico takšno, kot je --> <pre>\n#\n# Skladnja je sledeča:\n# * Vse od znaka »#« do konca vrstice je pripomba\n# * Vsaka neprazna vrstica je delec regularnega izraza, ki se bo ujemal samo z gostitelji v URL-jih\n\n #</pre> <!-- pustite to vrstico takšno, kot je -->",
+ "spam-whitelist": " #<!-- pustite to vrstico takšno, kot je --> <pre>\n# Zunanji URL-ji, ki se ujemajo s tem seznamom, *ne* bodo blokirani,\n# četudi bi bili blokirani z vnosi črnega seznama.\n#\n# Skladnja je sledeča:\n# * Vse od znaka »#« do konca vrstice je pripomba\n# * Vsaka neprazna vrstica je delec regularnega izraza, ki se bo ujemal samo z gostitelji v URL-jih\n\n #</pre> <!-- pustite to vrstico takšno, kot je -->",
+ "email-blacklist": "# Registracija in pošiljanje z e-poštnih naslovov, ki se ujemajo s spodnjim seznamom, bosta preprečena\n # Seznam vpliva samo na ta wiki; glejte tudi globalni črni seznam.\n # Za dokumentacijo glejte https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- to vrstico pustite natančno takšno, kakršna je --> <pre>\n#\n# Opis skladnje:\n# * Vse od znaka \"#\" do konca vrstice je komentar *\n# Vsaka neprazna vrstica je regularni izraz, ki se lahko ujema le z imeni gostiteljev v e-poštnih naslovih\n\n #</pre> <!-- to vrstico pustite natančno takšno, kakršna je -->",
+ "email-whitelist": "#<!-- to vrstico pustite natančno takšno, kakršna je --> <pre>\n# E-poštni naslovi, ki se ujemajo s tem seznamom, *ne* bodo blokirani, tudi če bi\n# bili blokirani z vnosi na črnem seznamu.\n#\n #</pre> <!-- to vrstico pustite natančno takšno, kakršna je -->\n# Opis skladnje:\n# * Vse od znaka \"#\" do konca vrstice je komentar\n# * Vsaka neprazna vrstica je regularni izraz, ki se lahko ujema le z imenom gostitelja v e-poštnem naslovu",
+ "spam-blacklisted-email": "E-poštni naslov na črnem seznamu",
+ "spam-blacklisted-email-text": "Vaš e-poštni naslov je trenutno na črnem seznamu, zato ne morete pošiljati pošte drugim uporabnikom.",
+ "spam-blacklisted-email-signup": "E-poštni naslov je trenutno na črnem seznamu.",
+ "spam-invalid-lines": "{{PLURAL:$1|Naslednja vrstica|Naslednji vrstici|Naslednje vrstice}} črnega seznama smetja {{PLURAL:$1|je neveljavni regularni izraz in ga|sta neveljavna regularna izraza in ju|so neveljavni regularni izrazi in jih}} je pred shranjevanjem strani potrebno popraviti:",
+ "spam-blacklist-desc": "Orodje proti smetju, temelječe na regularnih izrazih, ki omogoča navedbo spletnih naslovov na straneh in v e-poštnih naslovih za registrirane uporabnike na črnem seznamu",
+ "log-name-spamblacklist": "Dnevnik črnega seznama smetja",
+ "log-description-spamblacklist": "Ti dogodki sledijo zadetke črnega seznama smetja.",
+ "logentry-spamblacklist-hit": "$1 je povzročil zadetek na črnem seznamu smetja na strani $3 ob dodajanju povezave $4",
+ "right-spamblacklistlog": "Prikaz dnevnika črnega seznama smetja",
+ "action-spamblacklistlog": "ogled dnevnika s črnim seznamom smetja",
+ "apihelp-spamblacklist-description": "Ovrednoti enega ali več URL-jev s SpamBlacklist.",
+ "apihelp-spamblacklist-param-url": "URL-ji za primerjavo s črnim seznamom.",
+ "apihelp-spamblacklist-example-1": "Preveri dva URL-ja s črnim seznamom."
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/sq.json b/www/wiki/extensions/SpamBlacklist/i18n/sq.json
new file mode 100644
index 00000000..f6a02804
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/sq.json
@@ -0,0 +1,15 @@
+{
+ "@metadata": {
+ "authors": [
+ "FatosMorina",
+ "Olsi"
+ ]
+ },
+ "spam-blacklist": " # URL-të e jashtme që përputhen me këtë listë do të bllokohen kur shtohen tek një faqe.\n # Kjo listë ndikon vetëm në këtë wiki; referojuni gjithashtu listës së zezë globale.\n # Për dokumentacionin shiko https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- leave this line exactly as it is --> <pre>\n#\n# Sintaksa është si më poshtë:\n# * Çdo gjë nga një karakter \"#\" në fund të rreshtit është një koment\n# * Çdo rresht jobosh është një fragment që do të përputhë vetëm hostet brenda URL-ve\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# URL-të e jashtme që përputhen më këtë listë *nuk* nuk do të bllokohen edhe nëse ato do të\n# kishin qenë të bllokuara nga shënimet e listës së zezë.\n#\n# Sintaksa është si më poshtë:\n# * Çdo gjë nga një karakter \"#\" në fund të rreshtit është një koment\n# * Çdo rresht jobosh është një fragment që vetëm do të përputhë hostet brenda URL-ve\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-blacklisted-email": "E-mail adresa e vendosur në listën e zezë",
+ "spam-blacklisted-email-text": "E-mail adresa juaj është për momentin në penguar nga dërgimi i e-mailave tek përdoruesit e tjerë.",
+ "spam-blacklisted-email-signup": "E-mail adresa e dhënë për momentin është ndaluuar nga përdorimi",
+ "spam-invalid-lines": "Lista e zezë e mëposhtme spam {{PLURAL:$1|rreshti është një|rreshtat janë}} {{PLURAL:$1|shprehje|shprehje}} të rregullta të pavlefshme dhe {{PLURAL:$1|nevojitet|nevojitet}} të korrigjohen përpara ruajtjes së faqes:",
+ "spam-blacklist-desc": "Mjeti anti-spam regex i bazuar: [[MediaWiki:Spam-blacklist]] dhe [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/sr-ec.json b/www/wiki/extensions/SpamBlacklist/i18n/sr-ec.json
new file mode 100644
index 00000000..2529a135
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/sr-ec.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "Millosh",
+ "Milicevic01",
+ "Srdjan m"
+ ]
+ },
+ "spam-blacklist": " #<!-- ову линију не дирајте--> <pre>\n# URL-и наведени овде неће моћи да се додају на странице.\n# Овај списак важи само за овај вики, за остале употребе погледајте глобални црни списак.\n# Документација је на https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# Синтакса је следећа:\n# * Све од знака „#“ до краја линије је коментар\n# * Свака линија која није празна је део регуларног израза (regex fragment) која одговара имену хоста у URL-у\n\n #</pre> <!-- ову линију не дирајте -->",
+ "spam-whitelist": " #<!-- ову линију не дирајте--> <pre>\n# URL-и наведени овде *неће* бити блокирани чак и ако\n# се налазе на црном списку.\n#\n# Синтакса је следећа:\n# * Све од знака „#“ до краја линије је коментар\n# * Свака линија која није празна је део регуларног израза (regex fragment) која одговара имену хоста у URL-у\n\n #</pre> <!-- ову линију не дирајте -->",
+ "spam-blacklist-desc": "Антиспам оруђе засновано на регуларним изразима које онемогућава унос URL адреса односно имејл адреса које се налазе у црном списку",
+ "log-name-spamblacklist": "Дневник црног списка спама",
+ "log-description-spamblacklist": "Овај дневник приказује поготке у црном списку спама.",
+ "logentry-spamblacklist-hit": "$1 је {{GENDER:$2|направио|направила}} погодак у црном списку спама на страници $3 покушавајући да дода $4.",
+ "right-spamblacklistlog": "преглед дневника црног списка спама",
+ "action-spamblacklistlog": "преглед дневника црног списка спама"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/sr-el.json b/www/wiki/extensions/SpamBlacklist/i18n/sr-el.json
new file mode 100644
index 00000000..4e9e3bc1
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/sr-el.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Michaello",
+ "Milicevic01"
+ ]
+ },
+ "spam-blacklist": " #<!-- ovu liniju ne dirajte--> <pre>\n# URL-i navedeni ovde neće moći da se dodaju na stranice.\n# Ovaj spisak važi samo za ovaj viki, za ostale upotrebe pogledajte globalni crni spisak.\n# Dokumentacija je na https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# Sintaksa je sledeća:\n# * Sve od znaka „#“ do kraja linije je komentar\n# * Svaka linija koja nije prazna je deo regularnog izraza (regex fragment) koja odgovara imenu hosta u URL-u\n\n #</pre> <!-- ovu liniju ne dirajte -->",
+ "spam-whitelist": " #<!-- ovu liniju ne dirajte--> <pre>\n# URL-i navedeni ovde *neće* biti blokirani čak i ako\n# se nalaze na crnom spisku.\n#\n# Sintaksa je sledeća:\n# * Sve od znaka „#“ do kraja linije je komentar\n# * Svaka linija koja nije prazna je deo regularnog izraza (regex fragment) koja odgovara imenu hosta u URL-u\n\n #</pre> <!-- ovu liniju ne dirajte -->",
+ "spam-blacklist-desc": "Antispam oruđe zasnovano na regularnim izrazima: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]",
+ "log-name-spamblacklist": "Dnevnik crnog spiska spama",
+ "log-description-spamblacklist": "Ovaj dnevnik prikazuje pogotke u crnom spisku spama.",
+ "logentry-spamblacklist-hit": "$1 je {{GENDER:$2|napravio|napravila}} pogodak u crnom spisku spama na stranici $3 pokušavajući da doda $4.",
+ "right-spamblacklistlog": "pregled dnevnika crnog spiska spama",
+ "action-spamblacklistlog": "pregled dnevnika crnog spiska spama"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/stq.json b/www/wiki/extensions/SpamBlacklist/i18n/stq.json
new file mode 100644
index 00000000..17d15afa
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/stq.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Pyt"
+ ]
+ },
+ "spam-blacklist": " # Externe URLs, do der in disse Lieste äntheelden sunt, blokkierje dät Spiekerjen fon ju Siede.\n # Disse Lieste beträft bloot dit Wiki; sjuch uk ju globoale Blacklist.\n # Tou ju Dokumenation sjuch https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- Disse Riege duur nit ferannerd wäide! --> <pre>\n#\n# Syntax:\n# * Alles fon dät \"#\"-Teeken ou bit tou Eende fon ju Riege is n Kommentoar\n# * Älke nit-loose Riege is n regulären Uutdruk, ju der juun do Host-Noomen in do URLs wröiged wäd.\n\n #</pre> <!-- Disse Riege duur nit ferannerd wäide! -->",
+ "spam-whitelist": " #<!-- Disse Riege duur nit ferannerd wäide! --> <pre>\n# Externe URLs, do der in disse Lieste äntheelden sunt, blokkierje dät Spiekerjen fon ju Siede nit,\n# uk wan jo in ju globoale of lokoale swotte Lieste äntheelden sunt.\n#\n# Syntax:\n# * Alles fon dät \"#\"-Teeken ou bit tou Eende fon ju Riege is n Kommentoar\n# * Älke nit-loose Riege is n regulären Uutdruk, die der juun do Host-Noomen in do URLs wröided wäd.\n\n #</pre> <!-- Disse Riege duur nit ferannerd wäide! -->",
+ "spam-invalid-lines": "{{PLURAL:$1\n\t| Ju foulgjende Siede in ju Spam-Blacklist is n uungultigen regulären Uutdruk. Ju mout foar dät Spiekerjen fon ju Siede korrigierd wäide\n\t| Do foulgjende Sieden in ju Spam-Blacklist sunt uungultige reguläre Uutdrukke. Do mouten foar dät Spiekerjen fon ju Siede korrigierd wäide}}:",
+ "spam-blacklist-desc": "Regex-basierde Anti-Spam-Reewe: [[MediaWiki:Spam-blacklist]] un [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/sv.json b/www/wiki/extensions/SpamBlacklist/i18n/sv.json
new file mode 100644
index 00000000..f83f208d
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/sv.json
@@ -0,0 +1,30 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ainali",
+ "Lejonel",
+ "Lokal Profil",
+ "Skalman",
+ "WikiPhoenix",
+ "Hangsna",
+ "NH"
+ ]
+ },
+ "spam-blacklist": " #<!-- ändra inte den här raden --> <pre>\n# Den här listan stoppar matchande externa URL:er från att läggas till på sidor.\n# Listan påverkar bara den här wikin; se även den globala svartlistan.\n# För dokumentation se https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# Syntaxen är följande:\n# * All text från ett #-tecken till radens slut är en kommentar\n# * Alla icke-tomma rader används som reguljära uttryck för att matcha domännamn i URL:er\n\n #</pre> <!-- ändra inte den här raden -->",
+ "spam-whitelist": "\n #<!-- ändra inte den här raden --> <pre>\n# Externa URL:er som matchar den här listan blockeras *inte*,\n# inte ens om de är blockerade genom den svarta listan för spam.\n#\n# Syntaxen är följande:\n# * All text från ett #-tecken till radens slut är en kommentar\n# * Alla icke-tomma rader används som reguljära uttryck för att matcha domännamn i URL:er\n\n #</pre> <!-- ändra inte den här raden -->",
+ "email-blacklist": " #<!-- ändra inte den här raden --> <pre>\n# E-postadresser som matchar den här listan kommer att hindras att registrera och skicka e-post\n# Denna lista gäller endast denna wiki; se även den globala svartlistan.\n# För dokumentation se https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# Syntaxen är följande:\n# * Allt från ett \"#\"-tecken till slutet av raden är en kommentar\n# * Varje icke-tom rad är ett regex-fragment som endast kommer att matcha värdnamn i e-postadresser\n #</pre> <!-- ändra inte den här raden -->",
+ "email-whitelist": " #<!-- ändra inte den här raden --> <pre>\n# E-postadresser som matchar den här listan kommer *inte* att blockeras, även om de skulle ha blivit blockerade av svartlistan.\n#\n# Syntaxen är följande:\n# * Allt från ett \"#\"-tecken till slutet av raden är en kommentar\n# * Varje icke-tom rad är ett regex-fragment som endast kommer att matcha värdnamn i e-postadresser\n\n #</pre> <!-- ändra inte den här raden -->",
+ "spam-blacklisted-email": "Svartlistad e-postadress",
+ "spam-blacklisted-email-text": "Din e-postadress är för närvarande svartlistad från att skicka e-post till andra användare.",
+ "spam-blacklisted-email-signup": "Den angivna e-postadressen är förnärvarande svartlistad från användning.",
+ "spam-invalid-lines": "Följande {{PLURAL:$1|rad|rader}} i svarta listan för spam innehåller inte något giltigt reguljärt uttryck och måste rättas innan sidan sparas:",
+ "spam-blacklist-desc": "Antispamverktyg baserat på reguljära uttryck som gör det möjligt att svartlista webbadresser på sidor och e-postadresser för registrerade användare",
+ "log-name-spamblacklist": "Spamfilterlogg",
+ "log-description-spamblacklist": "Här visas händelser som utlöst spamfiltret",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}} utlöste spamfiltret vid redigering av $3 genom att försöka lägga till $4.",
+ "right-spamblacklistlog": "Visa svartlistningslogg för spam",
+ "action-spamblacklistlog": "visa svartlistningsloggen för spam",
+ "apihelp-spamblacklist-description": "Validera en eller flera URL:er mot SpamBlacklist.",
+ "apihelp-spamblacklist-param-url": "URL:er att validera mot svartlistan.",
+ "apihelp-spamblacklist-example-1": "Kontrollera två URL:er mot svartlistan"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/ta.json b/www/wiki/extensions/SpamBlacklist/i18n/ta.json
new file mode 100644
index 00000000..56f176ee
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/ta.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Karthi.dr",
+ "மதனாஹரன்"
+ ]
+ },
+ "spam-blacklisted-email": "தடை செய்யப்பட்டுள்ள மின்னஞ்சல் முகவரிகள்",
+ "spam-blacklisted-email-text": "மற்ற பயனர்களுக்கு மின்னஞ்சல் செய்ய இயலாதபடி உங்கள் மின்னஞ்சல் முகவரி தடை செய்யப்பட்டுள்ளது.",
+ "spam-blacklisted-email-signup": "வழங்கப்பட்ட மின்னஞ்சல் முகவரியானது இப்போது பயன்பாட்டிலிருநது விலக்கப்பட்டுக் கறுப்புப் பட்டியலிலுள்ளது."
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/te.json b/www/wiki/extensions/SpamBlacklist/i18n/te.json
new file mode 100644
index 00000000..45fc3449
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/te.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Veeven"
+ ]
+ },
+ "spam-blacklist": "\n # ఓ పేజీకి చేర్చిన బయటి లింకులు గనక ఈ జాబితాతో సరిపోలితే వాటిని నిరోధిస్తాం.\n # ఈ జాబితా ఈ వికీకి మాత్రమే సంబంధించినది; మహా నిరోధపు జాబితాని కూడా చూడండి.\n # పత్రావళి కొరకు ఇక్కడ చూడండి: https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- leave this line exactly as it is --> <pre>\n#\n# Syntax is as follows:\n# * \"#\" అన్న అక్షరం నుండి లైను చివరివరకూ ఉన్నదంతా వ్యాఖ్య\n# * ఖాళీగా లేని ప్రతీలైనూ URLలలోని హోస్ట్ పేరుని మాత్రమే సరిపోల్చే ఒక regex తునక\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-whitelist": "\n #<!-- leave this line exactly as it is --> <pre>\n# ఈ జాబితాకి సరిపోలిన బయటి లింకులని *నిరోధించము*,\n# అవి నిరోధపు జాబితాలోని పద్దులతో సరిపోలినా గానీ.\n#\n# ఛందస్సు ఇదీ:\n# * \"#\" అక్షరం నుండి లైను చివరివరకూ ప్రతీదీ ఓ వ్యాఖ్యే\n# * ఖాళీగా లేని ప్రతీ లైనూ URLలలో హోస్ట్ పేరుని సరిపోల్చే regex తునక\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-invalid-lines": "స్పామ్ నిరోధపు జాబితాలోని క్రింద పేర్కొన్న {{PLURAL:$1|లైను|లైన్లు}} తప్పుగా {{PLURAL:$1|ఉంది|ఉన్నాయి}}, పేజీని భద్రపరిచేముందు {{PLURAL:$1|దాన్ని|వాటిని}} సరిదిద్దండి:",
+ "spam-blacklist-desc": "Regex-ఆధారిత స్పామ్ నిరోధక పనిముట్టు: [[MediaWiki:Spam-blacklist]] మరియు [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/tg-cyrl.json b/www/wiki/extensions/SpamBlacklist/i18n/tg-cyrl.json
new file mode 100644
index 00000000..90a08973
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/tg-cyrl.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ibrahim"
+ ]
+ },
+ "spam-blacklist": " # Нишониҳои URL берунаи ба ин феҳрист мутобиқатшуда вақте, ки ба саҳифае илова мешаванд, \n # баста хоҳанд шуд.\n # Ин феҳрист фақат рӯи ҳамин вики таъсир мекунад; ба феҳристи сиёҳи саросар низ муроҷиат кунед.\n # Барои мустанадот, нигаред ба https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- ин сатрро ҳамонгуна, ки ҳаст раҳо кунед --> <pre>\n#\n # Дастурот ба ин шакл ҳастанд:\n # * Ҳама чиз аз аломати \"#\" то поёни сатр ба унвони тавзеҳ ба назар гирифта мешавад\n # * Ҳар сатр аз матн ба унвони як дастур regex ба назар гирифта мешавад, \n # ки фақат бо номи мизбон дар нишонии интернетии URL мутобиқат дода мешавад\n\n #</pre> <!-- ин сатрро ҳамонгуна, ки ҳаст раҳо кунед -->",
+ "spam-whitelist": " #<!-- ин сатрро ҳамонгуна, ки ҳаст раҳо кунед --> <pre>\n# Нишониҳои URL берунаи ба ин феҳрист мутобиқатбуда, баста нахоҳанд шуд, \n# ҳатто агар дар феҳристи сиёҳ қарор дошта бошад.\n#\n# Дастурот ба ин шакл ҳастанд:\n# * Ҳама чиз аз аломати \"#\" то поёни сатр ба унвони тавзеҳ ба назар гирифта мешавад\n# * Ҳар сатр аз матн ба унвони як дастур regex ба назар гирифта мешавад, ки фақат бо номи мизбон дар \n# нишонии интернетии URL мутобиқат дода мешавад\n #</pre> <!-- ин сатрро ҳамонгуна, ки ҳаст раҳо кунед -->",
+ "spam-invalid-lines": "{{PLURAL:$1|Сатри|Сатрҳои}} зерин дар феҳристи сиёҳи ҳарзнигорӣ дастуроти ғайри миҷозе regular expressions {{PLURAL:$1|аст|ҳастанд}} ва қабл аз захира кардани саҳифа ба ислоҳ кардан ниёз {{PLURAL:$1|дорад|доранд}}:",
+ "spam-blacklist-desc": "Абзори зидди ҳарзнигорӣ дар асоси Regex: [[MediaWiki:Spam-blacklist]] ва [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/tg-latn.json b/www/wiki/extensions/SpamBlacklist/i18n/tg-latn.json
new file mode 100644
index 00000000..fdff07cc
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/tg-latn.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Liangent"
+ ]
+ },
+ "spam-blacklist": " # Nişonihoi URL berunai ba in fehrist mutobiqatşuda vaqte, ki ba sahifae ilova meşavand, \n # basta xohand şud.\n # In fehrist faqat rūi hamin viki ta'sir mekunad; ba fehristi sijohi sarosar niz muroçiat kuned.\n # Baroi mustanadot, nigared ba https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- in satrro hamonguna, ki hast raho kuned --> <pre>\n#\n # Dasturot ba in şakl hastand:\n # * Hama ciz az alomati \"#\" to pojoni satr ba unvoni tavzeh ba nazar girifta meşavad\n # * Har satr az matn ba unvoni jak dastur regex ba nazar girifta meşavad, \n # ki faqat bo nomi mizbon dar nişoniji internetiji URL mutobiqat doda meşavad\n\n #</pre> <!-- in satrro hamonguna, ki hast raho kuned -->",
+ "spam-whitelist": " #<!-- in satrro hamonguna, ki hast raho kuned --> <pre>\n# Nişonihoi URL berunai ba in fehrist mutobiqatbuda, basta naxohand şud, \n# hatto agar dar fehristi sijoh qaror doşta boşad.\n#\n# Dasturot ba in şakl hastand:\n# * Hama ciz az alomati \"#\" to pojoni satr ba unvoni tavzeh ba nazar girifta meşavad\n# * Har satr az matn ba unvoni jak dastur regex ba nazar girifta meşavad, ki faqat bo nomi mizbon dar \n# nişoniji internetiji URL mutobiqat doda meşavad\n #</pre> <!-- in satrro hamonguna, ki hast raho kuned -->",
+ "spam-invalid-lines": "{{PLURAL:$1|Satri|Satrhoi}} zerin dar fehristi sijohi harznigorī dasturoti ƣajri miçoze regular expressions {{PLURAL:$1|ast|hastand}} va qabl az zaxira kardani sahifa ba isloh kardan nijoz {{PLURAL:$1|dorad|dorand}}:",
+ "spam-blacklist-desc": "Abzori ziddi harznigorī dar asosi Regex: [[MediaWiki:Spam-blacklist]] va [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/tk.json b/www/wiki/extensions/SpamBlacklist/i18n/tk.json
new file mode 100644
index 00000000..2fe72ea9
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/tk.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hanberke"
+ ]
+ },
+ "spam-invalid-lines": "Aşakdaky spam gara sanawynyň {{PLURAL:$1|setiri|setiri}} nädogry regulýar {{PLURAL:$1|aňlatmadyr|aňlatmadyr}} we sahypa ýazdyrylmanka düzedilmelidir:",
+ "spam-blacklist-desc": "Regulýar aňlatmalar esasynda anti-spam guraly: [[MediaWiki:Spam-blacklist]] we [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/tl.json b/www/wiki/extensions/SpamBlacklist/i18n/tl.json
new file mode 100644
index 00000000..081542fe
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/tl.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "AnakngAraw"
+ ]
+ },
+ "spam-blacklist": " # Ang panlabas na mga URL na tumutugma sa talaang ito ay hahadlangan/haharangin kapag idinagdag sa isang pahina.\n # Nakakaapekto lamang ang talaang ito sa wiking ito; sumangguni rin sa pandaigdigang talaan ng pinagbabawalan.\n # Para sa kasulatan tingnan ang https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- leave this line exactly as it is --> <pre>\n#\n# Ang palaugnayan ay ayon sa mga sumusunod:\n# * Lahat ng bagay mula sa isang \"#\" na panitik hanggang sa wakas ng isang guhit/hanay ay isang puna (kumento)\n# * Bawat hindi/walang patlang na guhit/hanay ay isang piraso ng karaniwang pagsasaad (''regex'') na tutugma lamang sa mga tagapagpasinaya sa loob ng mga URL\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# Ang panlabas na mga URL na tumutugma sa talaang ito ay *hindi* hahadlangan kahit na sila ay\n# hinarang ng mga ipinasok (entrada) sa talaan ng pinagbabawalan.\n#\n# Ang palaugnayan ay ayon sa mga sumusunod:\n# * Lahat ng bagay mula sa isang \"#\" na panitik hanggang sa wakas ng isang guhit/hanay ay isang puna (kumento)\n# * Bawat hindi/walang patlang na guhit/hanay ay isang piraso ng karaniwang pagsasaad (''regex'') na tutugma lamang sa mga tagapagpasinaya sa loob ng mga URL\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "email-blacklist": " # Ang mga tirahan ng e-liham na tumutugma sa talaang ito ay hahadlangan mula sa pagpaparehistro o pagpapadala ng mga e-liham.\n # Nakakaapekto lamang ang talaang ito sa wiking ito; sumangguni rin sa pandaigdigang talaan ng pinagbabawalan.\n # Para sa kasulatan tingnan ang https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- leave this line exactly as it is --> <pre>\n#\n# Ang palaugnayan ay ayon sa mga sumusunod:\n# * Lahat ng bagay mula sa isang panitik na \"#\" magpahanggang sa wakas ng isang guhit ay isang puna\n# * Bawat guhit na mayroong laman ay isang piraso ng karaniwang pagsasaad (''regex'') na tutugma lamang sa mga tagapagpasinaya sa loob ng mga tirahan ng e-liham\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "email-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# Ang mga tirahan ng e-liham na tumutugma sa listahang ito ay *hindi* haharangin kahit na gawin nila ito\n# ay naharang ng mga lahot sa talaan ng pinagbabawalan.\n#\n #</pre> <!-- leave this line exactly as it is -->\n# Ang palaugnayan ay ang mga sumusunod:\n# * Ang lahat ng mga bagay magmula sa isang panitik na \"#\" magpahanggang sa wakas ng guhit ay isang puna\n# * Bawat linya na mayroong laman ay isang piraso ng karaniwang pagsasaad (''regex'') na tutugma lamang sa mga tagapagpasinayang nasa loob ng mga tirahan ng e-liham",
+ "spam-blacklisted-email": "Pinagbabawalang mga tirahan ng e-liham",
+ "spam-blacklisted-email-text": "Kasalukuyang pinagbabawalan ang iyong tirahan ng e-liham na makapagpadala ng mga e-liham papunta sa ibang mga tagagamit.",
+ "spam-blacklisted-email-signup": "Kasalukuyang ipinagbabawal ang paggamit ng ibinigay na tirahan ng e-liham.",
+ "spam-invalid-lines": "Ang sumusunod na {{PLURAL:$1|isang hanay/guhit|mga hanay/guhit}} ng talaan ng pinagbabawalang \"manlulusob\" (''spam'') ay hindi tanggap na karaniwang {{PLURAL:$1|pagsasaad|mga pagsasaad}} at {{PLURAL:$1|kinakailangang|kinakailangang}} maitama muna bago sagipin ang pahina:",
+ "spam-blacklist-desc": "Kasangkapang panlaban sa \"manlulusob\" (''spam'') na nakabatay sa karaniwang pagsasaad (''regex''): [[MediaWiki:Spam-blacklist]] at [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/tr.json b/www/wiki/extensions/SpamBlacklist/i18n/tr.json
new file mode 100644
index 00000000..7605b559
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/tr.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Joseph",
+ "Arystanbek",
+ "Incelemeelemani",
+ "Vito Genovese"
+ ]
+ },
+ "spam-blacklist": " # Bu listeyle eşleşen dış bağlantılar, bir sayfaya eklendiğinde engellenecektir. \n # Bu liste sadece bu vikiyi etkiler; ayrıca küresel karalisteye de bakın.\n # Dokümantasyon için https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- bu satırı olduğu gibi bırakın --> <pre>\n#\n# Sözdizimi aşağıdaki gibidir:\n# * \"#\" karakterinden satır sonuna kadar her şey bir yorumdur\n# * Her boş olmayan satır, sadece URLlerin içindeki sunucularla eşleşen regex parçasıdır\n\n #</pre> <!-- bu satırı olduğu gibi bırakın -->",
+ "spam-whitelist": " #<!-- bu satırı olduğu gibi bırakın --> <pre>\n# Bu listeyle eşlenen dış bağlantılar *engellenmeyecektir*,\n# karaliste girdileriyle engellenmiş olsalar bile.\n#\n# Sözdizimi aşağıdaki gibidir:\n# * \"#\" karakterinden satır sonuna kadar her şey bir yorumdur\n# * Her boş olmayan satır, sadece URLlerin içindeki sunucularla eşleşen regex parçasıdır\n\n #</pre> <!--bu satırı olduğu gibi bırakın -->",
+ "spam-blacklisted-email": "Kara listeye e-posta adresi",
+ "spam-blacklisted-email-text": "E-posta adresinizi şu anda diğer kullanıcılara e-posta gönderme ve gelen kara listeye alındı.",
+ "spam-blacklisted-email-signup": "Verilen e-posta adresi şu anda gelen kara listeye alındı.",
+ "spam-invalid-lines": "Şu spam karaliste {{PLURAL:$1|satırı|satırları}} geçersiz düzenli {{PLURAL:$1|tanımdır|tanımlardır}} ve sayfayı kaydetmeden düzeltilmesi gerekmektedir:",
+ "spam-blacklist-desc": "Düzenli ifade tabanlı anti-spam kayıtlı kullanıcılar için sayfaları ve e-posta adresleri kara listeye URL için izin aracı",
+ "log-name-spamblacklist": "Reklam kara listesi günlüğü",
+ "log-description-spamblacklist": "Bu olaylar, spam kara liste, hit parça.",
+ "logentry-spamblacklist-hit": "{{CİNSİYET:$2|$1}} neden bir spam kara liste, vurmak $3 tarafından eklemeye $4.",
+ "right-spamblacklistlog": "Reklam kara listesini gör",
+ "action-spamblacklistlog": "reklam kara listesi günlüğünü gör",
+ "apihelp-spamblacklist-description": "Bu SpamBlacklist karşı bir veya daha fazla URL doğrulamak.",
+ "apihelp-spamblacklist-param-url": "Kara liste URL lerine yönelik doğrulama",
+ "apihelp-spamblacklist-example-1": "Kara liste URL lerini iki defa kontrol ediniz"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/uk.json b/www/wiki/extensions/SpamBlacklist/i18n/uk.json
new file mode 100644
index 00000000..3a0074e5
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/uk.json
@@ -0,0 +1,31 @@
+{
+ "@metadata": {
+ "authors": [
+ "AS",
+ "Ahonc",
+ "Andriykopanytsia",
+ "AtUkr",
+ "Base",
+ "Ата",
+ "Piramidion"
+ ]
+ },
+ "spam-blacklist": "# Зовнішні посилання, що відповідають цьому списку, будуть заборонені для внесення на стоірнки.\n # Цей список діє лише для цієї вікі, існує також загальний чорний список.\n # Докладніше на сторінці https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- не змінюйте цей рядок --> <pre>\n#\n# Синтаксис:\n# * Все, починаючи із символу \"#\" і до кінця рядка, вважається коментарем\n# * Кожен непорожній рядок є фрагментом регулярного виразу, який застосовується тільки до вузла в URL\n\n #</pre> <!-- не змінюйте цей рядок -->",
+ "spam-whitelist": " #<!-- не змінюйте це рядок --> <pre>\n# Зовнішні посилання, що відповідають цьому списку, *не* будуть блокуватися, навіть якщо вони потрапили до чорного списку.\n#\n# Синтаксис:\n# * Усе, починаючи з символу \"#\" і до кінця рядка, вважається коментарем\n# * Кожен непорожній рядок є фрагментом регулярного виразу, який застосовується тільки до вузла в URL\n\n #</pre> <!-- не изменяйте эту строку -->",
+ "email-blacklist": "#<!-- не змінюйте цей рядок --> <pre>\n# Адреси електронної пошти, що відповідають цьому списку, будуть заблоковані від реєстрації або надсилання ел. пошти.\n# Цей список діє тільки для даної вікі, існує також загальний чорний список.\n# Докладніше на сторінці https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# Синтаксис:\n# * Все, починаючи з символу \"#\" і до кінця рядка, вважається коментарем\n# * Кожен непорожній рядок є фрагментом регулярного виразу, вживаного тільки до вузлів усередині адреси ел. пошти\n\n#</pre> <!-- не змінюйте цей рядок -->",
+ "email-whitelist": "#<!-- не змінюйте цей рядок --> <pre>\n# Адреси електронної пошти, що відповідають цьому списку, НЕ БУДУТЬ заблоковані\n# навіть якщо вони занесені до чорного списку.\n#\n#</pre> <!-- не змінюйте цей рядок --> \n# Синтаксис:\n# * Все, починаючи з символу \"#\" і до кінця рядка, вважається коментарем\n# * Кожен непорожній рядок є фрагментом регулярного виразу, вживаного тільки до вузлів усередині адреси ел. пошти",
+ "spam-blacklisted-email": "Адреса електронної пошти з чорного списку",
+ "spam-blacklisted-email-text": "Ваша адреса електронної пошти в даний час знаходиться в чорному списку, тому ви не можете надсилати повідомлення іншим користувачам.",
+ "spam-blacklisted-email-signup": "Вказана Вами адреса електронної пошти наразі занесена до чорного списку і не може бути використаною.",
+ "spam-invalid-lines": "{{PLURAL:$1|1=Наступний рядок із чорного списку посилань містить помилковий регулярний вираз і його треба виправити|Наступні рядки із чорного списку посилань містять помилкові регулярні вирази і їх треба виправити}} перед збереженням:",
+ "spam-blacklist-desc": "Засновану на регулярних виразах антиспам інструмент, який дозволяє кидати у чорний список URL сторінки і адреси електронної пошти для зареєстрованих користувачів",
+ "log-name-spamblacklist": "Журнал чорного списку спамерів",
+ "log-description-spamblacklist": "Ці події відстежують потрапляння у чорний список спамерів.",
+ "logentry-spamblacklist-hit": "$1 спричинив потрапляння у чорний список спамерів на $3, намагаючись додати $4.",
+ "right-spamblacklistlog": "перегляд журналу чорного списку спамерів",
+ "action-spamblacklistlog": "перегляд журналу \"чорний список\" спамерів",
+ "apihelp-spamblacklist-description": "Перевірити одну або кілька URL-адрес через SpamBlacklist.",
+ "apihelp-spamblacklist-summary": "Перевірити одну або кілька URL-адрес на наявність у SpamBlacklist.",
+ "apihelp-spamblacklist-param-url": "URL-адреса для перевірки у чорному списку.",
+ "apihelp-spamblacklist-example-1": "Перевірка двох URL-адрес по чорному списку"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/ur.json b/www/wiki/extensions/SpamBlacklist/i18n/ur.json
new file mode 100644
index 00000000..325febcc
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/ur.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Muhammad Shuaib"
+ ]
+ },
+ "spam-blacklisted-email": "فہرست سیاہ میں موجود برقی ڈاک پتے",
+ "log-name-spamblacklist": "نوشتہ فاضل کاری برائے فہرست سیاہ",
+ "right-spamblacklistlog": "سیاہ فہرست کے نوشتۂ فاضل کاری کا معائنہ",
+ "action-spamblacklistlog": "سیاہ فہرست کے نوشتۂ فاضل کاری کا معائنہ کرنے"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/vec.json b/www/wiki/extensions/SpamBlacklist/i18n/vec.json
new file mode 100644
index 00000000..718db487
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/vec.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "Candalua",
+ "GatoSelvadego"
+ ]
+ },
+ "spam-blacklist": " # Le URL esterne al sito che corisponde a la lista seguente le vegnarà blocà.\n # La lista la xe valida solo par sto sito qua; far riferimento anca a la blacklist globale.\n # Par la documentazion vardar https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- no sta modificar in alcun modo sta riga --> <pre>\n# La sintassi la xe la seguente:\n# * Tuto quel che segue un caràtere \"#\" el xe un comento, fin a la fine de la riga\n# * Tute le righe mìa vode le xe framenti de espressioni regolari che se àplica al solo nome de l'host ne le URL\n #</pre> <!-- no sta modificar in alcun modo sta riga -->",
+ "spam-whitelist": " #<!-- no sta modificar in alcun modo sta riga --> <pre>\n# Le URL esterne al sito che corisponde a la lista seguente *no* le vegnarà\n# mìa blocà, anca nel caso che le corisponda a de le voçi de la lista nera\n#\n# La sintassi la xe la seguente:\n# * Tuto quel che segue un caràtere \"#\" el xe un comento, fin a la fine de la riga\n# * Tute le righe mìa vode le xe framenti de espressioni regolari che se àplica al solo nome de l'host ne le URL\n\n #</pre> <!-- no sta modificar in alcun modo sta riga -->",
+ "email-blacklist": " # I indirisi e-mail che corisponde a ła lista seguente i sarà blocai, nó sarà posibiłe salvar o inviar e-mail.\n # Ła lista ła xe vałida soło che pa' sta wiki; far riferimento anca a ła blacklist globałe.\n # Pa' ła documentasion se varde https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n # <!-- nó modifegar sta linea --> <pre>\n# Ła sintasi ła xe ła seguente:\n# * Tuto chel che xe conprexo intrà un caratere \"#\" e ła fine de ła riga el xe un comento\n# * Tute łe righe nó vode i xe tochi de espresion regołari che se aplica soło che al nome del host de i indirisi e-mail\n #</pre> <!-- nó modifegar sta linea -->",
+ "email-whitelist": " #<!-- nó modifegar sta linea --> <pre>\n# I indirisi e-mail conprexi in sta lista *nó* i sarà blocai anca se i dovaria\n# eser stai blocai da i elementi prexenti inte ła lista nera.\n#\n #</pre> <!-- nó modifegar sta linea -->\n# Ła sintasi ła xe ła seguente:\n# * Tuto chel che xe conprexo intrà un caratere \"#\" e ła fine de ła riga el xe un comento\n# * Tute łe righe nó vode i xe tochi de espresion regołari che se aplica soło che al nome del host de i indirisi e-mail",
+ "spam-blacklisted-email": "Indiriso de posta eletronega blocà",
+ "spam-blacklisted-email-text": "El to indiriso de posta eletronega el xe atualmente inte ła lista nera par 'l invio de e-mail verso altri utenti.",
+ "spam-blacklisted-email-signup": "El indiriso de posta eletronega indicà el xe atualmente inte ła lista nera.",
+ "spam-invalid-lines": "{{PLURAL:$1|La seguente riga|Le seguenti righe}} de la lista nera del spam {{PLURAL:$1|no la xe na espression regolare valida|no le xe espressioni regolari valide}}; se prega de corègiar {{PLURAL:$1|l'eror|i erori}} prima de salvar la pagina.",
+ "spam-blacklist-desc": "Strumento antispam basà su le espressioni regolari [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/vi.json b/www/wiki/extensions/SpamBlacklist/i18n/vi.json
new file mode 100644
index 00000000..6a25a624
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/vi.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Minh Nguyen"
+ ]
+ },
+ "spam-blacklist": " # Các địa chỉ URL ngoài trùng với một khoản trong danh sách này bị cấm không được thêm vào trang nào.\n # Danh sách này chỉ có hiệu lực ở wiki này; hãy xem thêm “danh sách đen toàn cầu”.\n # Có tài liệu hướng dẫn tại https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- leave this line exactly as it is --> <pre>\n#\n# Cú pháp:\n# * Các lời ghi chú bắt đầu với ký tự “#” và tiếp tục cho đến cuối dòng.\n# * Các dòng không để trống là một mảnh biểu thức chính quy, nó chỉ trùng với tên máy chủ trong địa chỉ URL.\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "spam-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# Các địa chỉ URL ngoài trùng với một khoản trong danh sách này *không* bị cấm, dù có nó trong danh sách đen.\n#\n# Cú pháp:\n# * Các lời ghi chú bắt đầu với ký tự “#” và tiếp tục cho đến cuối dòng.\n# * Các dòng không để trống là một mảnh biểu thức chính quy, nó chỉ trùng với tên máy chủ trong địa chỉ URL.\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "email-blacklist": " # Các địa chỉ thư điện tử trùng với danh sách này bị cấm không được mở tài khoản hoặc gửi thư điện tử.\n # Danh sách này chỉ có hiệu lực ở wiki này; hãy xem thêm “danh sách đen toàn cầu”.\n # Có tài liệu hướng dẫn tại https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- leave this line exactly as it is --> <pre>\n#\n# Cú pháp:\n# * Các lời ghi chú bắt đầu với ký tự “#” và tiếp tục cho đến cuối dòng.\n# * Các dòng không để trống là một mảnh biểu thức chính quy, nó chỉ trùng với tên máy chủ trong địa chỉ thư điện tử.\n\n #</pre> <!-- leave this line exactly as it is -->",
+ "email-whitelist": " #<!-- leave this line exactly as it is --> <pre>\n# Các địa chỉ thư điện tử trùng với danh sách này *không* bị cấm, dù có nó trong danh sách đen.\n#\n #</pre> <!-- leave this line exactly as it is -->\n# Cú pháp:\n# * Các lời ghi chú bắt đầu với ký tự “#” và tiếp tục cho đến cuối dòng.\n# * Các dòng không để trống là một mảnh biểu thức chính quy, nó chỉ trùng với tên máy chủ trong địa chỉ thư điện tử.",
+ "spam-blacklisted-email": "Địa chỉ thư điện tử bị đưa vào danh sách đen",
+ "spam-blacklisted-email-text": "Địa chỉ thư điện tử của bạn đã được đưa vào danh sách đen nên bị cấm không được gửi thư điện tử cho người dùng khác.",
+ "spam-blacklisted-email-signup": "Địa chỉ thư điện tử được cung cấp đã được đưa vào danh sách đen nên bị cấm không được sử dụng.",
+ "spam-invalid-lines": "{{PLURAL:$1|Dòng|Những dòng}} sau đây trong danh sách đen về spam không hợp lệ; xin hãy sửa chữa {{PLURAL:$1|nó|chúng}} để tuân theo cú pháp biểu thức chính quy trước khi lưu trang:",
+ "spam-blacklist-desc": "Công cụ cho phép chống spam bằng cách cấm những URL trong trang và địa chỉ thư điện tử của thành viên đăng ký khớp với các biểu thức chính quy trong danh sách đen",
+ "log-name-spamblacklist": "Nhật trình chặn spam vì danh sách đen",
+ "log-description-spamblacklist": "Nhật trình này ghi các lần chặn spam vì nằm vào danh sách đen.",
+ "logentry-spamblacklist-hit": "{{GENDER:$2}}$1 bị danh sách đen chống spam ngăn không được thêm $4 vào $3.",
+ "right-spamblacklistlog": "Xem nhật trình chặn spam vì danh sách đen",
+ "action-spamblacklistlog": "xem nhật trình chặn spam vì danh sách đen"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/wuu.json b/www/wiki/extensions/SpamBlacklist/i18n/wuu.json
new file mode 100644
index 00000000..3f9802f4
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/wuu.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "十弌"
+ ]
+ },
+ "log-name-spamblacklist": "垃圾電郵黑名單日誌"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/yue.json b/www/wiki/extensions/SpamBlacklist/i18n/yue.json
new file mode 100644
index 00000000..99c038d5
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/yue.json
@@ -0,0 +1,7 @@
+{
+ "@metadata": [],
+ "spam-blacklist": " # 同呢個表合符嘅外部 URL 當加入嗰陣會被封鎖。\n # 呢個表只係會影響到呢個wiki;請同時參閱全域黑名單。\n # 要睇註解請睇 https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n #<!-- 請完全噉留番呢行 --> <pre>\n#\n# 語法好似下面噉:\n# * 每一個由 \"#\" 字元開頭嘅行,到最尾係一個註解\n# * 每個非空白行係一個標準表示式碎片,只係會同入面嘅URL端核對\n\n #</pre> <!-- 請完全噉留番呢行 -->",
+ "spam-whitelist": " #<!-- 請完全噉留番呢行 --> <pre>\n# 同呢個表合符嘅外部 URL ,即使響黑名單項目度封鎖,\n# 都*唔會*被封鎖。\n#\n# 語法好似下面噉:\n# * 每一個由 \"#\" 字元開頭嘅行,到最尾係一個註解\n# * 每個非空白行係一個標準表示式碎片,只係會同入面嘅URL端核對\n\n #</pre> <!-- 請完全噉留番呢行 -->",
+ "spam-invalid-lines": "下面響灌水黑名單嘅{{PLURAL:$1|一行|多行}}有無效嘅表示式,請響保存呢版之前先將{{PLURAL:$1|佢|佢哋}}修正:",
+ "spam-blacklist-desc": "以正規表達式為本嘅防灌水工具: [[MediaWiki:Spam-blacklist]] 同 [[MediaWiki:Spam-whitelist]]"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/zh-hans.json b/www/wiki/extensions/SpamBlacklist/i18n/zh-hans.json
new file mode 100644
index 00000000..3d70c003
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/zh-hans.json
@@ -0,0 +1,34 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hzy980512",
+ "Liangent",
+ "Linforest",
+ "Liuxinyu970226",
+ "Mys 721tx",
+ "PhiLiP",
+ "Supaiku",
+ "乌拉跨氪",
+ "Yfdyh000",
+ "WhitePhosphorus"
+ ]
+ },
+ "spam-blacklist": " #<!-- 请完整地保留此行 --> <pre>\n# 当加入的外部URL匹配该表时则会被禁止。\n# 该表只会影响本wiki项目;请同时参阅全域黑名单。\n# 文档参见https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# 语法如下:\n# * 由“#”开头的每行均为注释\n# * 非空白行为正则表达式片段,其只与内含该片段的URL匹配\n\n #</pre> <!-- 请完整地保留此行 -->",
+ "spam-whitelist": " #<!-- 请完整地保留此行 --> <pre>\n# 与该表匹配的URL,即使已被黑名单的规则禁止也*不会*被封禁。\n#\n# 语法如下:\n# * 由“#”开头的每行均为注释\n# * 非空白行为正则表达式片段,其只与内含该片段的URL匹配\n\n #</pre> <!-- 请完整地保留此行 -->",
+ "email-blacklist": " #<!-- 请完整地保留此行 --> <pre>\n# 与该表匹配的电子邮件地址将被禁止注册及发送邮件\n# 该表只会影响本wiki项目;请同时参阅全域黑名单。\n# 注解请见 https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# 语法如下:\n# * 由“#”开头的每行均为注释\n# * 非空白行为正则表达式片段,其只与内含该片段的电子邮件地址匹配\n\n #</pre> <!-- 请完整地保留此行 -->",
+ "email-whitelist": " #<!-- 请完整地保留此行 --> <pre>\n# 与该表匹配的电子邮件地址,即使已被黑名单的规则禁止也*不会*被封禁。\n#\n# 格式如下:\n# * 由“#”开头的每行均为注释\n# * 非空白行为正则表达式片段,其只与内含该片段的电子邮件地址匹配\n\n #</pre> <!-- 请完整地保留此行 -->",
+ "spam-blacklisted-email": "黑名单中的电子邮件地址",
+ "spam-blacklisted-email-text": "您的电子邮件地址目前已被列入黑名单以禁止您给其他用户发送邮件。",
+ "spam-blacklisted-email-signup": "所给电邮地址已被列入黑名单以禁止使用。",
+ "spam-invalid-lines": "下列垃圾链接黑名单存在{{PLURAL:$1|一行|多行}}无效的正则表示式,请在保存前修正:",
+ "spam-blacklist-desc": "基于正则表达式的反垃圾工具允许将页面URL及注册用电子邮件地址列入黑名单",
+ "log-name-spamblacklist": "垃圾链接黑名单日志",
+ "log-description-spamblacklist": "这个列表跟踪垃圾链接黑名单的触发。",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}}在$3上试图加入$4,触发了垃圾链接黑名单。",
+ "right-spamblacklistlog": "查看垃圾链接黑名单日志",
+ "action-spamblacklistlog": "查看垃圾链接黑名单日志",
+ "apihelp-spamblacklist-description": "验证一个或多个URL是否触发SpamBlacklist。",
+ "apihelp-spamblacklist-summary": "验证一个或多个URL是否触发垃圾链接黑名单。",
+ "apihelp-spamblacklist-param-url": "要验证是否触发黑名单的URL。",
+ "apihelp-spamblacklist-example-1": "检查两个URL是否触发黑名单"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/i18n/zh-hant.json b/www/wiki/extensions/SpamBlacklist/i18n/zh-hant.json
new file mode 100644
index 00000000..c76d7b5a
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/i18n/zh-hant.json
@@ -0,0 +1,27 @@
+{
+ "@metadata": {
+ "authors": [
+ "Liangent",
+ "Liuxinyu970226",
+ "Mark85296341",
+ "Oapbtommy",
+ "Waihorace",
+ "Cwlin0416",
+ "LNDDYL"
+ ]
+ },
+ "spam-blacklist": " #<!-- 請勿更動此行 --> <pre>\n# 任何加入到頁面的外部 URL 於此清單之中將會被封鎖。\n# 此清單有效範圍僅在本 Wiki,詳情請參考全域封鎖清單。\n# 相關文件請參考 https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# 語法格式如下:\n# * 任何以 \"#\" 字元開頭的行皆為註解\n# * 任何非空白的行會被作為正規表示法用來比對 URL 中的主機名稱\n #</pre> <!-- 請勿更動此行 -->",
+ "spam-whitelist": " #<!-- 請勿更動此行 --> <pre>\n# 任何外部 URL 於此清單中將 *不* 會被封鎖\n# 即使已經被加入封鎖清單當中。\n#\n# 語法格式如下:\n# * 任何以 \"#\" 字元開頭的行皆為註解\n# * 任何非空白的行會被作為正規表示法用來比對 URL 中的主機名稱\n #</pre> <!-- 請勿更動此行 -->",
+ "email-blacklist": " #<!-- 請勿更動此行 --> <pre>\n# 任何註冊或送出的 Email 位址於此清單之中將會被封鎖。\n# 此清單有效範圍僅在本 Wiki,詳情請參考全域封鎖清單。\n# 相關文件請參考 https://www.mediawiki.org/wiki/Extension:SpamBlacklist\n#\n# 語法格式如下:\n# * 任何以 \"#\" 字元開頭的行皆為註解\n# * 任何非空白的行會被作為正規表示法用來比對 Email 位址中的主機名稱\n #</pre> <!-- 請勿更動此行 -->",
+ "email-whitelist": " #<!-- 請勿更動此行 --> <pre>\n# 任何 Email 位址於此清單中將 *不* 會被封鎖\n# 即使已經被加入封鎖清單當中。\n#\n# 語法格式如下:\n# * 任何以 \"#\" 字元開頭的行皆為註解\n# * 任何非空白的行會被作為正規表示法用來比對 Email 位址中的主機名稱\n #</pre> <!-- 請勿更動此行 -->",
+ "spam-blacklisted-email": "已列入封鎖清單的 Email 位址",
+ "spam-blacklisted-email-text": "您的電子郵件地址目前已被列入封鎖清單,以防止您傳送郵件給其他使用者。",
+ "spam-blacklisted-email-signup": "提供的電子郵件地址目前已被列入封鎖清單,無法使用。",
+ "spam-invalid-lines": "下列濫用的封鎖清單中有{{PLURAL:$1|一行|多行}}使用了無效的正規表示法,須修正後才可儲存此頁面:",
+ "spam-blacklist-desc": "以正規表示法為基礎的防濫用工具,可封鎖頁面中的 URL 及已註冊使用者的 Email 地址。",
+ "log-name-spamblacklist": "濫用封鎖日誌",
+ "log-description-spamblacklist": "此頁記錄了所有符合濫用封鎖清單的事件。",
+ "logentry-spamblacklist-hit": "{{GENDER:$2|$1}} 於 $3 嘗試加入的 $4 符合濫用封鎖清單中的項目。",
+ "right-spamblacklistlog": "檢視濫用封鎖日誌",
+ "action-spamblacklistlog": "檢視濫用封鎖日誌"
+}
diff --git a/www/wiki/extensions/SpamBlacklist/includes/ApiSpamBlacklist.php b/www/wiki/extensions/SpamBlacklist/includes/ApiSpamBlacklist.php
new file mode 100644
index 00000000..5b91f2bc
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/includes/ApiSpamBlacklist.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * SpamBlacklist extension API
+ *
+ * Copyright © 2013 Wikimedia Foundation
+ * Based on code by Ian Baker, Victor Vasiliev, Bryan Tong Minh, Roan Kattouw,
+ * Alex Z., and Jackmcbarn
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/**
+ * Query module check a URL against the blacklist
+ *
+ * @ingroup API
+ * @ingroup Extensions
+ */
+class ApiSpamBlacklist extends ApiBase {
+
+ public function execute() {
+ $params = $this->extractRequestParams();
+ $matches = BaseBlacklist::getInstance( 'spam' )->filter( $params['url'], null, true );
+ $res = $this->getResult();
+
+ if ( $matches !== false ) {
+ // this url is blacklisted.
+ $res->addValue( 'spamblacklist', 'result', 'blacklisted' );
+ $res->setIndexedTagName( $matches, 'match' );
+ $res->addValue( 'spamblacklist', 'matches', $matches );
+ } else {
+ // not blacklisted
+ $res->addValue( 'spamblacklist', 'result', 'ok' );
+ }
+ }
+
+ public function getAllowedParams() {
+ return [
+ 'url' => [
+ ApiBase::PARAM_REQUIRED => true,
+ ApiBase::PARAM_ISMULTI => true,
+ ]
+ ];
+ }
+
+ /**
+ * @see ApiBase::getExamplesMessages()
+ * @return array
+ */
+ protected function getExamplesMessages() {
+ return [
+ 'action=spamblacklist&url=http://www.example.com/|http://www.example.org/'
+ => 'apihelp-spamblacklist-example-1',
+ ];
+ }
+
+ public function getHelpUrls() {
+ return [ 'https://www.mediawiki.org/wiki/Extension:SpamBlacklist/API' ];
+ }
+}
diff --git a/www/wiki/extensions/SpamBlacklist/includes/BaseBlacklist.php b/www/wiki/extensions/SpamBlacklist/includes/BaseBlacklist.php
new file mode 100644
index 00000000..add77e79
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/includes/BaseBlacklist.php
@@ -0,0 +1,448 @@
+<?php
+
+/**
+ * Base class for different kinds of blacklists
+ */
+abstract class BaseBlacklist {
+ /**
+ * Array of blacklist sources
+ *
+ * @var array
+ */
+ public $files = [];
+
+ /**
+ * Array containing regexes to test against
+ *
+ * @var bool|array
+ */
+ protected $regexes = false;
+
+ /**
+ * Chance of receiving a warning when the filter is hit
+ *
+ * @var int
+ */
+ public $warningChance = 100;
+
+ /**
+ * @var int
+ */
+ public $warningTime = 600;
+
+ /**
+ * @var int
+ */
+ public $expiryTime = 900;
+
+ /**
+ * Array containing blacklists that extend BaseBlacklist
+ *
+ * @var array
+ */
+ private static $blacklistTypes = [
+ 'spam' => 'SpamBlacklist',
+ 'email' => 'EmailBlacklist',
+ ];
+
+ /**
+ * Array of blacklist instances
+ *
+ * @var array
+ */
+ private static $instances = [];
+
+ /**
+ * Constructor
+ *
+ * @param array $settings
+ */
+ function __construct( $settings = [] ) {
+ foreach ( $settings as $name => $value ) {
+ $this->$name = $value;
+ }
+ }
+
+ /**
+ * @param array $links
+ * @param Title $title
+ * @param bool $preventLog
+ * @return mixed
+ */
+ abstract public function filter( array $links, Title $title, $preventLog = false );
+
+ /**
+ * Adds a blacklist class to the registry
+ *
+ * @param string $type
+ * @param string $class
+ */
+ public static function addBlacklistType( $type, $class ) {
+ self::$blacklistTypes[$type] = $class;
+ }
+
+ /**
+ * Return the array of blacklist types currently defined
+ *
+ * @return array
+ */
+ public static function getBlacklistTypes() {
+ return self::$blacklistTypes;
+ }
+
+ /**
+ * @return SpamBlacklist
+ */
+ public static function getSpamBlacklist() {
+ return self::getInstance( 'spam' );
+ }
+
+ /**
+ * @return EmailBlacklist
+ */
+ public static function getEmailBlacklist() {
+ return self::getInstance( 'email' );
+ }
+
+ /**
+ * Returns an instance of the given blacklist
+ *
+ * @deprecated Use getSpamBlacklist() or getEmailBlacklist() instead
+ * @param string $type Code for the blacklist
+ * @return BaseBlacklist
+ * @throws Exception
+ */
+ public static function getInstance( $type ) {
+ if ( !isset( self::$blacklistTypes[$type] ) ) {
+ throw new Exception( "Invalid blacklist type '$type' passed to " . __METHOD__ );
+ }
+
+ if ( !isset( self::$instances[$type] ) ) {
+ global $wgBlacklistSettings;
+
+ // Prevent notices
+ if ( !isset( $wgBlacklistSettings[$type] ) ) {
+ $wgBlacklistSettings[$type] = [];
+ }
+
+ $class = self::$blacklistTypes[$type];
+ self::$instances[$type] = new $class( $wgBlacklistSettings[$type] );
+ }
+
+ return self::$instances[$type];
+ }
+
+ /**
+ * Returns the code for the blacklist implementation
+ *
+ * @return string
+ */
+ abstract protected function getBlacklistType();
+
+ /**
+ * Check if the given local page title is a spam regex source.
+ *
+ * @param Title $title
+ * @return bool
+ */
+ public static function isLocalSource( Title $title ) {
+ global $wgDBname, $wgBlacklistSettings;
+
+ if ( $title->getNamespace() == NS_MEDIAWIKI ) {
+ $sources = [];
+ foreach ( self::$blacklistTypes as $type => $class ) {
+ $type = ucfirst( $type );
+ $sources += [
+ "$type-blacklist",
+ "$type-whitelist"
+ ];
+ }
+
+ if ( in_array( $title->getDBkey(), $sources ) ) {
+ return true;
+ }
+ }
+
+ $thisHttp = wfExpandUrl( $title->getFullUrl( 'action=raw' ), PROTO_HTTP );
+ $thisHttpRegex = '/^' . preg_quote( $thisHttp, '/' ) . '(?:&.*)?$/';
+
+ $files = [];
+ foreach ( self::$blacklistTypes as $type => $class ) {
+ if ( isset( $wgBlacklistSettings[$type]['files'] ) ) {
+ $files += $wgBlacklistSettings[$type]['files'];
+ }
+ }
+
+ foreach ( $files as $fileName ) {
+ $matches = [];
+ if ( preg_match( '/^DB: (\w*) (.*)$/', $fileName, $matches ) ) {
+ if ( $wgDBname == $matches[1] ) {
+ if ( $matches[2] == $title->getPrefixedDbKey() ) {
+ // Local DB fetch of this page...
+ return true;
+ }
+ }
+ } elseif ( preg_match( $thisHttpRegex, $fileName ) ) {
+ // Raw view of this page
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns the type of blacklist from the given title
+ *
+ * @todo building a regex for this is pretty overkill
+ * @param Title $title
+ * @return bool|string
+ */
+ public static function getTypeFromTitle( Title $title ) {
+ global $wgContLang;
+
+ $types = array_map( [ $wgContLang, 'ucfirst' ], array_keys( self::$blacklistTypes ) );
+ $regex = '/(' . implode( '|', $types ). ')-(?:blacklist|whitelist)/';
+
+ if ( preg_match( $regex, $title->getDBkey(), $m ) ) {
+ return strtolower( $m[1] );
+ }
+
+ return false;
+ }
+
+ /**
+ * Fetch local and (possibly cached) remote blacklists.
+ * Will be cached locally across multiple invocations.
+ * @return array set of regular expressions, potentially empty.
+ */
+ function getBlacklists() {
+ if ( $this->regexes === false ) {
+ $this->regexes = array_merge(
+ $this->getLocalBlacklists(),
+ $this->getSharedBlacklists() );
+ }
+ return $this->regexes;
+ }
+
+ /**
+ * Returns the local blacklist
+ *
+ * @return array Regular expressions
+ */
+ public function getLocalBlacklists() {
+ $that = $this;
+ $type = $this->getBlacklistType();
+
+ return ObjectCache::getMainWANInstance()->getWithSetCallback(
+ wfMemcKey( 'spamblacklist', $type, 'blacklist-regex' ),
+ $this->expiryTime,
+ function () use ( $that, $type ) {
+ return SpamRegexBatch::regexesFromMessage( "{$type}-blacklist", $that );
+ }
+ );
+ }
+
+ /**
+ * Returns the (local) whitelist
+ *
+ * @return array Regular expressions
+ */
+ public function getWhitelists() {
+ $that = $this;
+ $type = $this->getBlacklistType();
+
+ return ObjectCache::getMainWANInstance()->getWithSetCallback(
+ wfMemcKey( 'spamblacklist', $type, 'whitelist-regex' ),
+ $this->expiryTime,
+ function () use ( $that, $type ) {
+ return SpamRegexBatch::regexesFromMessage( "{$type}-whitelist", $that );
+ }
+ );
+ }
+
+ /**
+ * Fetch (possibly cached) remote blacklists.
+ * @return array
+ */
+ function getSharedBlacklists() {
+ $listType = $this->getBlacklistType();
+
+ wfDebugLog( 'SpamBlacklist', "Loading $listType regex..." );
+
+ if ( count( $this->files ) == 0 ) {
+ # No lists
+ wfDebugLog( 'SpamBlacklist', "no files specified\n" );
+ return [];
+ }
+
+ $miss = false;
+
+ $that = $this;
+ $regexes = ObjectCache::getMainWANInstance()->getWithSetCallback(
+ // This used to be cached per-site, but that could be bad on a shared
+ // server where not all wikis have the same configuration.
+ wfMemcKey( 'spamblacklist', $listType, 'shared-blacklist-regex' ),
+ $this->expiryTime,
+ function () use ( $that, &$miss ) {
+ $miss = true;
+ return $that->buildSharedBlacklists();
+ }
+ );
+
+ if ( !$miss ) {
+ wfDebugLog( 'SpamBlacklist', "Got shared spam regexes from cache\n" );
+ }
+
+ return $regexes;
+ }
+
+ /**
+ * Clear all primary blacklist cache keys
+ *
+ * @note: this method is unused atm
+ */
+ function clearCache() {
+ $listType = $this->getBlacklistType();
+
+ $cache = ObjectCache::getMainWANInstance();
+ $cache->delete( wfMemcKey( 'spamblacklist', $listType, 'shared-blacklist-regex' ) );
+ $cache->delete( wfMemcKey( 'spamblacklist', $listType, 'blacklist-regex' ) );
+ $cache->delete( wfMemcKey( 'spamblacklist', $listType, 'whitelist-regex' ) );
+
+ wfDebugLog( 'SpamBlacklist', "$listType blacklist local cache cleared.\n" );
+ }
+
+ function buildSharedBlacklists() {
+ $regexes = [];
+ $listType = $this->getBlacklistType();
+ # Load lists
+ wfDebugLog( 'SpamBlacklist', "Constructing $listType blacklist\n" );
+ foreach ( $this->files as $fileName ) {
+ $matches = [];
+ if ( preg_match( '/^DB: ([\w-]*) (.*)$/', $fileName, $matches ) ) {
+ $text = $this->getArticleText( $matches[1], $matches[2] );
+ } elseif ( preg_match( '/^(https?:)?\/\//', $fileName ) ) {
+ $text = $this->getHttpText( $fileName );
+ } else {
+ $text = file_get_contents( $fileName );
+ wfDebugLog( 'SpamBlacklist', "got from file $fileName\n" );
+ }
+
+ // Build a separate batch of regexes from each source.
+ // While in theory we could squeeze a little efficiency
+ // out of combining multiple sources in one regex, if
+ // there's a bad line in one of them we'll gain more
+ // from only having to break that set into smaller pieces.
+ $regexes = array_merge( $regexes,
+ SpamRegexBatch::regexesFromText( $text, $this, $fileName ) );
+ }
+
+ return $regexes;
+ }
+
+ function getHttpText( $fileName ) {
+ global $wgDBname, $messageMemc;
+ $listType = $this->getBlacklistType();
+
+ # HTTP request
+ # To keep requests to a minimum, we save results into $messageMemc, which is
+ # similar to $wgMemc except almost certain to exist. By default, it is stored
+ # in the database
+ # There are two keys, when the warning key expires, a random thread will refresh
+ # the real key. This reduces the chance of multiple requests under high traffic
+ # conditions.
+ $key = "{$listType}_blacklist_file:$fileName";
+ $warningKey = "$wgDBname:{$listType}filewarning:$fileName";
+ $httpText = $messageMemc->get( $key );
+ $warning = $messageMemc->get( $warningKey );
+
+ if ( !is_string( $httpText ) || ( !$warning && !mt_rand( 0, $this->warningChance ) ) ) {
+ wfDebugLog( 'SpamBlacklist', "Loading $listType blacklist from $fileName\n" );
+ $httpText = Http::get( $fileName );
+ if ( $httpText === false ) {
+ wfDebugLog( 'SpamBlacklist', "Error loading $listType blacklist from $fileName\n" );
+ }
+ $messageMemc->set( $warningKey, 1, $this->warningTime );
+ $messageMemc->set( $key, $httpText, $this->expiryTime );
+ } else {
+ wfDebugLog( 'SpamBlacklist', "Got $listType blacklist from HTTP cache for $fileName\n" );
+ }
+ return $httpText;
+ }
+
+ /**
+ * Fetch an article from this or another local MediaWiki database.
+ * This is probably *very* fragile, and shouldn't be used perhaps.
+ *
+ * @param string $wiki
+ * @param string $article
+ * @return string
+ */
+ function getArticleText( $wiki, $article ) {
+ wfDebugLog( 'SpamBlacklist',
+ "Fetching {$this->getBlacklistType()} blacklist from '$article' on '$wiki'...\n" );
+
+ $title = Title::newFromText( $article );
+ // Load all the relevant tables from the correct DB.
+ // This assumes that old_text is the actual text or
+ // that the external store system is at least unified.
+ if ( is_callable( [ Revision::class, 'getQueryInfo' ] ) ) {
+ $revQuery = Revision::getQueryInfo( [ 'page', 'text' ] );
+ } else {
+ $revQuery = [
+ 'tables' => [ 'revision', 'page', 'text' ],
+ 'fields' => array_merge(
+ Revision::selectFields(),
+ Revision::selectPageFields(),
+ Revision::selectTextFields()
+ ),
+ 'joins' => [
+ 'text' => [ 'JOIN', 'old_id=rev_text_id' ]
+ ],
+ ];
+ }
+ $row = wfGetDB( DB_REPLICA, [], $wiki )->selectRow(
+ $revQuery['tables'],
+ $revQuery['fields'],
+ [
+ 'page_namespace' => $title->getNamespace(), // assume NS IDs match
+ 'page_title' => $title->getDBkey(), // assume same case rules
+ ],
+ __METHOD__,
+ [],
+ [ 'page' => [ 'JOIN', 'rev_id=page_latest' ] ] + $revQuery['joins']
+ );
+
+ return $row
+ ? ContentHandler::getContentText( Revision::newFromRow( $row )->getContent() )
+ : false;
+ }
+
+ /**
+ * Returns the start of the regex for matches
+ *
+ * @return string
+ */
+ public function getRegexStart() {
+ return '/[a-z0-9_\-.]*';
+ }
+
+ /**
+ * Returns the end of the regex for matches
+ *
+ * @param int $batchSize
+ * @return string
+ */
+ public function getRegexEnd( $batchSize ) {
+ return ( $batchSize > 0 ) ? '/Sim' : '/im';
+ }
+
+ /**
+ * @param Title $title
+ * @param string[] $entries
+ */
+ public function warmCachesForFilter( Title $title, array $entries ) {
+ // subclass this
+ }
+}
diff --git a/www/wiki/extensions/SpamBlacklist/includes/EmailBlacklist.php b/www/wiki/extensions/SpamBlacklist/includes/EmailBlacklist.php
new file mode 100644
index 00000000..afcc8eb2
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/includes/EmailBlacklist.php
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * Email Blacklisting
+ */
+class EmailBlacklist extends BaseBlacklist {
+ /**
+ * @param array $links
+ * @param Title $title
+ * @param bool $preventLog
+ * @return mixed
+ */
+ public function filter( array $links, Title $title, $preventLog = false ) {
+ throw new LogicException( __CLASS__ . ' cannot be used to filter links.' );
+ }
+
+ /**
+ * Returns the code for the blacklist implementation
+ *
+ * @return string
+ */
+ protected function getBlacklistType() {
+ return 'email';
+ }
+
+ /**
+ * Checks a User object for a blacklisted email address
+ *
+ * @param User $user
+ * @return bool True on valid email
+ */
+ public function checkUser( User $user ) {
+ $blacklists = $this->getBlacklists();
+ $whitelists = $this->getWhitelists();
+
+ // The email to check
+ $email = $user->getEmail();
+
+ if ( !count( $blacklists ) ) {
+ // Nothing to check
+ return true;
+ }
+
+ // Check for whitelisted email addresses
+ if ( is_array( $whitelists ) ) {
+ wfDebugLog( 'SpamBlacklist', "Excluding whitelisted email addresses from " .
+ count( $whitelists ) . " regexes: " . implode( ', ', $whitelists ) . "\n" );
+ foreach ( $whitelists as $regex ) {
+ if ( preg_match( $regex, $email ) ) {
+ // Whitelisted email
+ return true;
+ }
+ }
+ }
+
+ # Do the match
+ wfDebugLog( 'SpamBlacklist', "Checking e-mail address against " . count( $blacklists ) .
+ " regexes: " . implode( ', ', $blacklists ) . "\n" );
+ foreach ( $blacklists as $regex ) {
+ if ( preg_match( $regex, $email ) ) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/www/wiki/extensions/SpamBlacklist/includes/SpamBlacklist.php b/www/wiki/extensions/SpamBlacklist/includes/SpamBlacklist.php
new file mode 100644
index 00000000..a6122bc9
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/includes/SpamBlacklist.php
@@ -0,0 +1,348 @@
+<?php
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+ exit;
+}
+
+use \MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\Database;
+
+class SpamBlacklist extends BaseBlacklist {
+ const STASH_TTL = 180;
+ const STASH_AGE_DYING = 150;
+
+ /**
+ * Changes to external links, for logging purposes
+ * @var array[]
+ */
+ private $urlChangeLog = [];
+
+ /**
+ * Returns the code for the blacklist implementation
+ *
+ * @return string
+ */
+ protected function getBlacklistType() {
+ return 'spam';
+ }
+
+ /**
+ * Apply some basic anti-spoofing to the links before they get filtered,
+ * see @bug 12896
+ *
+ * @param string $text
+ *
+ * @return string
+ */
+ protected function antiSpoof( $text ) {
+ $text = str_replace( '.', '.', $text );
+ return $text;
+ }
+
+ /**
+ * @param string[] $links An array of links to check against the blacklist
+ * @param Title $title The title of the page to which the filter shall be applied.
+ * This is used to load the old links already on the page, so
+ * the filter is only applied to links that got added. If not given,
+ * the filter is applied to all $links.
+ * @param bool $preventLog Whether to prevent logging of hits. Set to true when
+ * the action is testing the links rather than attempting to save them
+ * (e.g. the API spamblacklist action)
+ * @param string $mode Either 'check' or 'stash'
+ *
+ * @return string[]|bool Matched text(s) if the edit should not be allowed; false otherwise
+ */
+ function filter( array $links, Title $title = null, $preventLog = false, $mode = 'check' ) {
+ $statsd = MediaWikiServices::getInstance()->getStatsdDataFactory();
+ $cache = ObjectCache::getLocalClusterInstance();
+
+ // If there are no new links, and we are logging,
+ // mark all of the current links as being removed.
+ if ( !$links && $this->isLoggingEnabled() ) {
+ $this->logUrlChanges( $this->getCurrentLinks( $title ), [], [] );
+ }
+
+ if ( !$links ) {
+ return false;
+ }
+
+ sort( $links );
+ $key = $cache->makeKey(
+ 'blacklist',
+ $this->getBlacklistType(),
+ 'pass',
+ sha1( implode( "\n", $links ) ),
+ (string)$title
+ );
+ // Skip blacklist checks if nothing matched during edit stashing...
+ $knownNonMatchAsOf = $cache->get( $key );
+ if ( $mode === 'check' ) {
+ if ( $knownNonMatchAsOf ) {
+ $statsd->increment( 'spamblacklist.check-stash.hit' );
+
+ return false;
+ } else {
+ $statsd->increment( 'spamblacklist.check-stash.miss' );
+ }
+ } elseif ( $mode === 'stash' ) {
+ if ( $knownNonMatchAsOf && ( time() - $knownNonMatchAsOf ) < self::STASH_AGE_DYING ) {
+ return false; // OK; not about to expire soon
+ }
+ }
+
+ $blacklists = $this->getBlacklists();
+ $whitelists = $this->getWhitelists();
+
+ if ( count( $blacklists ) ) {
+ // poor man's anti-spoof, see bug 12896
+ $newLinks = array_map( [ $this, 'antiSpoof' ], $links );
+
+ $oldLinks = [];
+ if ( $title !== null ) {
+ $oldLinks = $this->getCurrentLinks( $title );
+ $addedLinks = array_diff( $newLinks, $oldLinks );
+ } else {
+ // can't load old links, so treat all links as added.
+ $addedLinks = $newLinks;
+ }
+
+ wfDebugLog( 'SpamBlacklist', "Old URLs: " . implode( ', ', $oldLinks ) );
+ wfDebugLog( 'SpamBlacklist', "New URLs: " . implode( ', ', $newLinks ) );
+ wfDebugLog( 'SpamBlacklist', "Added URLs: " . implode( ', ', $addedLinks ) );
+
+ if ( !$preventLog ) {
+ $this->logUrlChanges( $oldLinks, $newLinks, $addedLinks );
+ }
+
+ $links = implode( "\n", $addedLinks );
+
+ # Strip whitelisted URLs from the match
+ if ( is_array( $whitelists ) ) {
+ wfDebugLog( 'SpamBlacklist', "Excluding whitelisted URLs from " . count( $whitelists ) .
+ " regexes: " . implode( ', ', $whitelists ) . "\n" );
+ foreach ( $whitelists as $regex ) {
+ wfSuppressWarnings();
+ $newLinks = preg_replace( $regex, '', $links );
+ wfRestoreWarnings();
+ if ( is_string( $newLinks ) ) {
+ // If there wasn't a regex error, strip the matching URLs
+ $links = $newLinks;
+ }
+ }
+ }
+
+ # Do the match
+ wfDebugLog( 'SpamBlacklist', "Checking text against " . count( $blacklists ) .
+ " regexes: " . implode( ', ', $blacklists ) . "\n" );
+ $retVal = false;
+ foreach ( $blacklists as $regex ) {
+ wfSuppressWarnings();
+ $matches = [];
+ $check = ( preg_match_all( $regex, $links, $matches ) > 0 );
+ wfRestoreWarnings();
+ if ( $check ) {
+ wfDebugLog( 'SpamBlacklist', "Match!\n" );
+ global $wgRequest;
+ $ip = $wgRequest->getIP();
+ $fullUrls = [];
+ $fullLineRegex = substr( $regex, 0, strrpos( $regex, '/' ) ) . '.*/Sim';
+ preg_match_all( $fullLineRegex, $links, $fullUrls );
+ $imploded = implode( ' ', $fullUrls[0] );
+ wfDebugLog( 'SpamBlacklistHit', "$ip caught submitting spam: $imploded\n" );
+ if ( !$preventLog ) {
+ $this->logFilterHit( $title, $imploded ); // Log it
+ }
+ if ( $retVal === false ) {
+ $retVal = [];
+ }
+ $retVal = array_merge( $retVal, $fullUrls[1] );
+ }
+ }
+ if ( is_array( $retVal ) ) {
+ $retVal = array_unique( $retVal );
+ }
+ } else {
+ $retVal = false;
+ }
+
+ if ( $retVal === false ) {
+ // Cache the typical negative results
+ $cache->set( $key, time(), self::STASH_TTL );
+ if ( $mode === 'stash' ) {
+ $statsd->increment( 'spamblacklist.check-stash.store' );
+ }
+ }
+
+ return $retVal;
+ }
+
+ public function isLoggingEnabled() {
+ global $wgSpamBlacklistEventLogging;
+ return $wgSpamBlacklistEventLogging && class_exists( 'EventLogging' );
+ }
+
+ /**
+ * Diff added/removed urls and generate events for them
+ *
+ * @param string[] $oldLinks
+ * @param string[] $newLinks
+ * @param string[] $addedLinks
+ */
+ public function logUrlChanges( $oldLinks, $newLinks, $addedLinks ) {
+ if ( !$this->isLoggingEnabled() ) {
+ return;
+ }
+
+ $removedLinks = array_diff( $oldLinks, $newLinks );
+ foreach ( $addedLinks as $url ) {
+ $this->logUrlChange( $url, 'insert' );
+ }
+
+ foreach ( $removedLinks as $url ) {
+ $this->logUrlChange( $url, 'remove' );
+ }
+ }
+
+ /**
+ * Actually push the url change events post-save
+ *
+ * @param User $user
+ * @param Title $title
+ * @param int $revId
+ */
+ public function doLogging( User $user, Title $title, $revId ) {
+ if ( !$this->isLoggingEnabled() ) {
+ return;
+ }
+
+ $baseInfo = [
+ 'revId' => $revId,
+ 'pageId' => $title->getArticleID(),
+ 'pageNamespace' => $title->getNamespace(),
+ 'userId' => $user->getId(),
+ 'userText' => $user->getName(),
+ ];
+ $changes = $this->urlChangeLog;
+ // Empty the changes queue in case this function gets called more than once
+ $this->urlChangeLog = [];
+
+ DeferredUpdates::addCallableUpdate( function () use ( $changes, $baseInfo ) {
+ foreach ( $changes as $change ) {
+ EventLogging::logEvent(
+ 'ExternalLinksChange',
+ 15716074,
+ $baseInfo + $change
+ );
+ }
+ } );
+ }
+
+ /**
+ * Queue log data about change for a url addition or removal
+ *
+ * @param string $url
+ * @param string $action 'insert' or 'remove'
+ */
+ private function logUrlChange( $url, $action ) {
+ $parsed = wfParseUrl( $url );
+ if ( !isset( $parsed['host'] ) ) {
+ wfDebugLog( 'SpamBlacklist', "Unable to parse $url" );
+ return;
+ }
+ $info = [
+ 'action' => $action,
+ 'protocol' => $parsed['scheme'],
+ 'domain' => $parsed['host'],
+ 'path' => isset( $parsed['path'] ) ? $parsed['path'] : '',
+ 'query' => isset( $parsed['query'] ) ? $parsed['query'] : '',
+ 'fragment' => isset( $parsed['fragment'] ) ? $parsed['fragment'] : '',
+ ];
+
+ $this->urlChangeLog[] = $info;
+ }
+
+ /**
+ * Look up the links currently in the article, so we can
+ * ignore them on a second run.
+ *
+ * WARNING: I can add more *of the same link* with no problem here.
+ * @param Title $title
+ * @return array
+ */
+ function getCurrentLinks( Title $title ) {
+ $cache = ObjectCache::getMainWANInstance();
+ return $cache->getWithSetCallback(
+ // Key is warmed via warmCachesForFilter() from ApiStashEdit
+ $cache->makeKey( 'external-link-list', $title->getLatestRevID() ),
+ $cache::TTL_MINUTE,
+ function ( $oldValue, &$ttl, array &$setOpts ) use ( $title ) {
+ $dbr = wfGetDB( DB_REPLICA );
+ $setOpts += Database::getCacheSetOptions( $dbr );
+
+ return $dbr->selectFieldValues(
+ 'externallinks',
+ 'el_to',
+ [ 'el_from' => $title->getArticleID() ], // should be zero queries
+ __METHOD__
+ );
+ }
+ );
+ }
+
+ public function warmCachesForFilter( Title $title, array $entries ) {
+ $this->filter( $entries, $title, true /* no logging */, 'stash' );
+ }
+
+ /**
+ * Returns the start of the regex for matches
+ *
+ * @return string
+ */
+ public function getRegexStart() {
+ return '/(?:https?:)?\/\/+[a-z0-9_\-.]*(';
+ }
+
+ /**
+ * Returns the end of the regex for matches
+ *
+ * @param int $batchSize
+ * @return string
+ */
+ public function getRegexEnd( $batchSize ) {
+ return ')' . parent::getRegexEnd( $batchSize );
+ }
+ /**
+ * Logs the filter hit to Special:Log if
+ * $wgLogSpamBlacklistHits is enabled.
+ *
+ * @param Title $title
+ * @param string $url URL that the user attempted to add
+ */
+ public function logFilterHit( $title, $url ) {
+ global $wgUser, $wgLogSpamBlacklistHits;
+ if ( $wgLogSpamBlacklistHits ) {
+ $logEntry = new ManualLogEntry( 'spamblacklist', 'hit' );
+ $logEntry->setPerformer( $wgUser );
+ $logEntry->setTarget( $title );
+ $logEntry->setParameters( [
+ '4::url' => $url,
+ ] );
+ $logid = $logEntry->insert();
+ $log = new LogPage( 'spamblacklist' );
+ if ( $log->isRestricted() ) {
+ // Make sure checkusers can see this action if the log is restricted
+ // (which is the default)
+ if ( ExtensionRegistry::getInstance()->isLoaded( 'CheckUser' )
+ && class_exists( 'CheckUserHooks' )
+ ) {
+ $rc = $logEntry->getRecentChange( $logid );
+ CheckUserHooks::updateCheckUserData( $rc );
+ }
+ } else {
+ // If the log is unrestricted, publish normally to RC,
+ // which will also update checkuser
+ $logEntry->publish( $logid, "rc" );
+ }
+ }
+ }
+}
diff --git a/www/wiki/extensions/SpamBlacklist/includes/SpamBlacklistHooks.php b/www/wiki/extensions/SpamBlacklist/includes/SpamBlacklistHooks.php
new file mode 100644
index 00000000..ca8c656f
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/includes/SpamBlacklistHooks.php
@@ -0,0 +1,283 @@
+<?php
+
+/**
+ * Hooks for the spam blacklist extension
+ */
+class SpamBlacklistHooks {
+
+ /**
+ * Hook function for EditFilterMergedContent
+ *
+ * @param IContextSource $context
+ * @param Content $content
+ * @param Status $status
+ * @param string $summary
+ * @param User $user
+ * @param bool $minoredit
+ *
+ * @return bool
+ */
+ static function filterMergedContent(
+ IContextSource $context,
+ Content $content,
+ Status $status,
+ $summary,
+ User $user,
+ $minoredit
+ ) {
+ $title = $context->getTitle();
+
+ // get the link from the not-yet-saved page content.
+ $editInfo = $context->getWikiPage()->prepareContentForEdit( $content );
+ $pout = $editInfo->output;
+ $links = array_keys( $pout->getExternalLinks() );
+
+ // HACK: treat the edit summary as a link if it contains anything
+ // that looks like it could be a URL or e-mail address.
+ if ( preg_match( '/\S(\.[^\s\d]{2,}|[\/@]\S)/', $summary ) ) {
+ $links[] = $summary;
+ }
+
+ $spamObj = BaseBlacklist::getSpamBlacklist();
+ $matches = $spamObj->filter( $links, $title );
+
+ if ( $matches !== false ) {
+ $status->fatal( 'spamprotectiontext' );
+
+ foreach ( $matches as $match ) {
+ $status->fatal( 'spamprotectionmatch', $match );
+ }
+
+ $status->apiHookResult = [
+ 'spamblacklist' => implode( '|', $matches ),
+ ];
+ }
+
+ // Always return true, EditPage will look at $status->isOk().
+ return true;
+ }
+
+ public static function onParserOutputStashForEdit(
+ WikiPage $page,
+ Content $content,
+ ParserOutput $output
+ ) {
+ $links = array_keys( $output->getExternalLinks() );
+ $spamObj = BaseBlacklist::getSpamBlacklist();
+ $spamObj->warmCachesForFilter( $page->getTitle(), $links );
+ }
+
+ /**
+ * Verify that the user can send emails
+ *
+ * @param User &$user
+ * @param array &$hookErr
+ * @return bool
+ */
+ public static function userCanSendEmail( &$user, &$hookErr ) {
+ $blacklist = BaseBlacklist::getEmailBlacklist();
+ if ( $blacklist->checkUser( $user ) ) {
+ return true;
+ }
+
+ $hookErr = [ 'spam-blacklisted-email', 'spam-blacklisted-email-text', null ];
+
+ return false;
+ }
+
+ /**
+ * Hook function for EditFilter
+ * Confirm that a local blacklist page being saved is valid,
+ * and toss back a warning to the user if it isn't.
+ *
+ * @param EditPage $editPage
+ * @param string $text
+ * @param string $section
+ * @param string &$hookError
+ * @return bool
+ */
+ static function validate( EditPage $editPage, $text, $section, &$hookError ) {
+ $title = $editPage->getTitle();
+ $thisPageName = $title->getPrefixedDBkey();
+
+ if ( !BaseBlacklist::isLocalSource( $title ) ) {
+ wfDebugLog( 'SpamBlacklist',
+ "Spam blacklist validator: [[$thisPageName]] not a local blacklist\n"
+ );
+ return true;
+ }
+
+ $type = BaseBlacklist::getTypeFromTitle( $title );
+ if ( $type === false ) {
+ return true;
+ }
+
+ $lines = explode( "\n", $text );
+
+ $badLines = SpamRegexBatch::getBadLines( $lines, BaseBlacklist::getInstance( $type ) );
+ if ( $badLines ) {
+ wfDebugLog( 'SpamBlacklist',
+ "Spam blacklist validator: [[$thisPageName]] given invalid input lines: " .
+ implode( ', ', $badLines ) . "\n"
+ );
+
+ $badList = "*<code>" .
+ implode( "</code>\n*<code>",
+ array_map( 'wfEscapeWikiText', $badLines ) ) .
+ "</code>\n";
+ $hookError =
+ "<div class='errorbox'>" .
+ wfMessage( 'spam-invalid-lines' )->numParams( $badLines )->text() . "<br />" .
+ $badList .
+ "</div>\n" .
+ "<br clear='all' />\n";
+ } else {
+ wfDebugLog( 'SpamBlacklist',
+ "Spam blacklist validator: [[$thisPageName]] ok or empty blacklist\n"
+ );
+ }
+
+ return true;
+ }
+
+ /**
+ * Hook function for PageContentSaveComplete
+ * Clear local spam blacklist caches on page save.
+ *
+ * @param WikiPage $wikiPage
+ * @param User $user
+ * @param Content $content
+ * @param string $summary
+ * @param bool $isMinor
+ * @param bool $isWatch
+ * @param string $section
+ * @param int $flags
+ * @param Revision|null $revision
+ * @param Status $status
+ * @param int $baseRevId
+ *
+ * @return bool
+ */
+ static function pageSaveContent(
+ WikiPage $wikiPage,
+ User $user,
+ Content $content,
+ $summary,
+ $isMinor,
+ $isWatch,
+ $section,
+ $flags,
+ $revision,
+ Status $status,
+ $baseRevId
+ ) {
+ if ( $revision ) {
+ BaseBlacklist::getSpamBlacklist()
+ ->doLogging( $user, $wikiPage->getTitle(), $revision->getId() );
+ }
+
+ if ( !BaseBlacklist::isLocalSource( $wikiPage->getTitle() ) ) {
+ return true;
+ }
+
+ // This sucks because every Blacklist needs to be cleared
+ foreach ( BaseBlacklist::getBlacklistTypes() as $type => $class ) {
+ $blacklist = BaseBlacklist::getInstance( $type );
+ $blacklist->clearCache();
+ }
+
+ return true;
+ }
+
+ /**
+ * @param UploadBase $upload
+ * @param User $user
+ * @param array $props
+ * @param string $comment
+ * @param string $pageText
+ * @param array|ApiMessage &$error
+ * @return bool
+ */
+ public static function onUploadVerifyUpload(
+ UploadBase $upload,
+ User $user,
+ array $props,
+ $comment,
+ $pageText,
+ &$error
+ ) {
+ $title = $upload->getTitle();
+
+ // get the link from the not-yet-saved page content.
+ $content = ContentHandler::makeContent( $pageText, $title );
+ $parserOptions = $content->getContentHandler()->makeParserOptions( 'canonical' );
+ $output = $content->getParserOutput( $title, null, $parserOptions );
+ $links = array_keys( $output->getExternalLinks() );
+
+ // HACK: treat comment as a link if it contains anything
+ // that looks like it could be a URL or e-mail address.
+ if ( preg_match( '/\S(\.[^\s\d]{2,}|[\/@]\S)/', $comment ) ) {
+ $links[] = $comment;
+ }
+ if ( !$links ) {
+ return true;
+ }
+
+ $spamObj = BaseBlacklist::getSpamBlacklist();
+ $matches = $spamObj->filter( $links, $title );
+
+ if ( $matches !== false ) {
+ $error = new ApiMessage(
+ wfMessage( 'spamprotectiontext' ),
+ 'spamblacklist',
+ [
+ 'spamblacklist' => [ 'matches' => $matches ],
+ 'message' => [
+ 'key' => 'spamprotectionmatch',
+ 'params' => $matches[0],
+ ],
+ ]
+ );
+ }
+
+ return true;
+ }
+
+ /**
+ * @param WikiPage &$article
+ * @param User &$user
+ * @param string &$reason
+ * @param string &$error
+ */
+ public static function onArticleDelete( WikiPage &$article, User &$user, &$reason, &$error ) {
+ $spam = BaseBlacklist::getSpamBlacklist();
+ if ( !$spam->isLoggingEnabled() ) {
+ return;
+ }
+
+ // Log the changes, but we only commit them once the deletion has happened.
+ // We do that since the external links table could get cleared before the
+ // ArticleDeleteComplete hook runs
+ $spam->logUrlChanges( $spam->getCurrentLinks( $article->getTitle() ), [], [] );
+ }
+
+ /**
+ * @param WikiPage &$page
+ * @param User &$user
+ * @param string $reason
+ * @param int $id
+ * @param Content|null $content
+ * @param LogEntry $logEntry
+ */
+ public static function onArticleDeleteComplete(
+ &$page,
+ User &$user,
+ $reason,
+ $id,
+ Content $content = null,
+ LogEntry $logEntry
+ ) {
+ $spam = BaseBlacklist::getSpamBlacklist();
+ $spam->doLogging( $user, $page->getTitle(), $page->getLatest() );
+ }
+}
diff --git a/www/wiki/extensions/SpamBlacklist/includes/SpamBlacklistLogFormatter.php b/www/wiki/extensions/SpamBlacklist/includes/SpamBlacklistLogFormatter.php
new file mode 100644
index 00000000..e0c20079
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/includes/SpamBlacklistLogFormatter.php
@@ -0,0 +1,11 @@
+<?php
+
+class SpamBlacklistLogFormatter extends LogFormatter {
+
+ protected function getMessageParameters() {
+ $params = parent::getMessageParameters();
+ $params[3] = Message::rawParam( htmlspecialchars( $params[3] ) );
+ return $params;
+ }
+
+}
diff --git a/www/wiki/extensions/SpamBlacklist/includes/SpamBlacklistPreAuthenticationProvider.php b/www/wiki/extensions/SpamBlacklist/includes/SpamBlacklistPreAuthenticationProvider.php
new file mode 100644
index 00000000..ed87203d
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/includes/SpamBlacklistPreAuthenticationProvider.php
@@ -0,0 +1,14 @@
+<?php
+
+use MediaWiki\Auth\AbstractPreAuthenticationProvider;
+
+class SpamBlacklistPreAuthenticationProvider extends AbstractPreAuthenticationProvider {
+ public function testForAccountCreation( $user, $creator, array $reqs ) {
+ $blacklist = BaseBlacklist::getEmailBlacklist();
+ if ( $blacklist->checkUser( $user ) ) {
+ return StatusValue::newGood();
+ }
+
+ return StatusValue::newFatal( 'spam-blacklisted-email-signup' );
+ }
+}
diff --git a/www/wiki/extensions/SpamBlacklist/includes/SpamRegexBatch.php b/www/wiki/extensions/SpamBlacklist/includes/SpamRegexBatch.php
new file mode 100644
index 00000000..d7d70e7e
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/includes/SpamRegexBatch.php
@@ -0,0 +1,175 @@
+<?php
+
+/**
+ * Utility class for working with blacklists
+ */
+class SpamRegexBatch {
+ /**
+ * Build a set of regular expressions matching URLs with the list of regex fragments.
+ * Returns an empty list if the input list is empty.
+ *
+ * @param array $lines list of fragments which will match in URLs
+ * @param BaseBlacklist $blacklist
+ * @param int $batchSize largest allowed batch regex;
+ * if 0, will produce one regex per line
+ * @return array
+ */
+ static function buildRegexes( $lines, BaseBlacklist $blacklist, $batchSize=4096 ) {
+ # Make regex
+ # It's faster using the S modifier even though it will usually only be run once
+ // $regex = 'https?://+[a-z0-9_\-.]*(' . implode( '|', $lines ) . ')';
+ // return '/' . str_replace( '/', '\/', preg_replace('|\\\*/|', '/', $regex) ) . '/Sim';
+ $regexes = [];
+ $regexStart = $blacklist->getRegexStart();
+ $regexEnd = $blacklist->getRegexEnd( $batchSize );
+ $build = false;
+ foreach ( $lines as $line ) {
+ if ( substr( $line, -1, 1 ) == "\\" ) {
+ // Final \ will break silently on the batched regexes.
+ // Skip it here to avoid breaking the next line;
+ // warnings from getBadLines() will still trigger on
+ // edit to keep new ones from floating in.
+ continue;
+ }
+ // FIXME: not very robust size check, but should work. :)
+ if ( $build === false ) {
+ $build = $line;
+ } elseif ( strlen( $build ) + strlen( $line ) > $batchSize ) {
+ $regexes[] = $regexStart .
+ str_replace( '/', '\/', preg_replace( '|\\\*/|u', '/', $build ) ) .
+ $regexEnd;
+ $build = $line;
+ } else {
+ $build .= '|';
+ $build .= $line;
+ }
+ }
+ if ( $build !== false ) {
+ $regexes[] = $regexStart .
+ str_replace( '/', '\/', preg_replace( '|\\\*/|u', '/', $build ) ) .
+ $regexEnd;
+ }
+ return $regexes;
+ }
+
+ /**
+ * Confirm that a set of regexes is either empty or valid.
+ *
+ * @param array $regexes set of regexes
+ * @return bool true if ok, false if contains invalid lines
+ */
+ static function validateRegexes( $regexes ) {
+ foreach ( $regexes as $regex ) {
+ wfSuppressWarnings();
+ $ok = preg_match( $regex, '' );
+ wfRestoreWarnings();
+
+ if ( $ok === false ) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Strip comments and whitespace, then remove blanks
+ *
+ * @param array $lines
+ * @return array
+ */
+ static function stripLines( $lines ) {
+ return array_filter(
+ array_map( 'trim',
+ preg_replace( '/#.*$/', '',
+ $lines ) ) );
+ }
+
+ /**
+ * Do a sanity check on the batch regex.
+ *
+ * @param array $lines unsanitized input lines
+ * @param BaseBlacklist $blacklist
+ * @param bool|string $fileName optional for debug reporting
+ * @return array of regexes
+ */
+ static function buildSafeRegexes( $lines, BaseBlacklist $blacklist, $fileName=false ) {
+ $lines = self::stripLines( $lines );
+ $regexes = self::buildRegexes( $lines, $blacklist );
+ if ( self::validateRegexes( $regexes ) ) {
+ return $regexes;
+ } else {
+ // _Something_ broke... rebuild line-by-line; it'll be
+ // slower if there's a lot of blacklist lines, but one
+ // broken line won't take out hundreds of its brothers.
+ if ( $fileName ) {
+ wfDebugLog( 'SpamBlacklist', "Spam blacklist warning: bogus line in $fileName\n" );
+ }
+ return self::buildRegexes( $lines, $blacklist, 0 );
+ }
+ }
+
+ /**
+ * Returns an array of invalid lines
+ *
+ * @param array $lines
+ * @param BaseBlacklist $blacklist
+ * @return array of input lines which produce invalid input, or empty array if no problems
+ */
+ static function getBadLines( $lines, BaseBlacklist $blacklist ) {
+ $lines = self::stripLines( $lines );
+
+ $badLines = [];
+ foreach ( $lines as $line ) {
+ if ( substr( $line, -1, 1 ) == "\\" ) {
+ // Final \ will break silently on the batched regexes.
+ $badLines[] = $line;
+ }
+ }
+
+ $regexes = self::buildRegexes( $lines, $blacklist );
+ if ( self::validateRegexes( $regexes ) ) {
+ // No other problems!
+ return $badLines;
+ }
+
+ // Something failed in the batch, so check them one by one.
+ foreach ( $lines as $line ) {
+ $regexes = self::buildRegexes( [ $line ], $blacklist );
+ if ( !self::validateRegexes( $regexes ) ) {
+ $badLines[] = $line;
+ }
+ }
+ return $badLines;
+ }
+
+ /**
+ * Build a set of regular expressions from the given multiline input text,
+ * with empty lines and comments stripped.
+ *
+ * @param string $source
+ * @param BaseBlacklist $blacklist
+ * @param bool|string $fileName optional, for reporting of bad files
+ * @return array of regular expressions, potentially empty
+ */
+ static function regexesFromText( $source, BaseBlacklist $blacklist, $fileName=false ) {
+ $lines = explode( "\n", $source );
+ return self::buildSafeRegexes( $lines, $blacklist, $fileName );
+ }
+
+ /**
+ * Build a set of regular expressions from a MediaWiki message.
+ * Will be correctly empty if the message isn't present.
+ *
+ * @param string $message
+ * @param BaseBlacklist $blacklist
+ * @return array of regular expressions, potentially empty
+ */
+ static function regexesFromMessage( $message, BaseBlacklist $blacklist ) {
+ $source = wfMessage( $message )->inContentLanguage();
+ if ( !$source->isDisabled() ) {
+ return self::regexesFromText( $source->plain(), $blacklist );
+ } else {
+ return [];
+ }
+ }
+}
diff --git a/www/wiki/extensions/SpamBlacklist/maintenance/cleanup.php b/www/wiki/extensions/SpamBlacklist/maintenance/cleanup.php
new file mode 100644
index 00000000..0a7236bc
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/maintenance/cleanup.php
@@ -0,0 +1,114 @@
+<?php
+/**
+ * An aggressive spam cleanup script.
+ * Searches the database for matching pages, and reverts them to
+ * the last non-spammed revision.
+ * If all revisions contain spam, blanks the page
+ */
+
+$IP = getenv( 'MW_INSTALL_PATH' );
+if ( $IP === false ) {
+ $IP = __DIR__ . '/../../..';
+}
+require_once "$IP/maintenance/Maintenance.php";
+
+class Cleanup extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->requireExtension( 'SpamBlacklist' );
+ $this->addOption( 'dry-run', 'Only do a dry run' );
+ }
+
+ public function execute() {
+ $user = User::newSystemUser( 'Spam cleanup script', [ 'steal' => true ] );
+
+ $sb = BaseBlacklist::getSpamBlacklist();
+ $regexes = $sb->getBlacklists();
+ if ( !$regexes ) {
+ $this->fatalError( "Invalid regex, can't clean up spam" );
+ }
+ $dryRun = $this->hasOption( 'dry-run' );
+
+ $dbr = wfGetDB( DB_REPLICA );
+ $maxID = (int)$dbr->selectField( 'page', 'MAX(page_id)' );
+ $reportingInterval = 100;
+
+ $this->output( "Regexes are " . implode( ', ', array_map( 'count', $regexes ) ) . " bytes\n" );
+ $this->output( "Searching for spam in $maxID pages...\n" );
+ if ( $dryRun ) {
+ $this->output( "Dry run only\n" );
+ }
+
+ for ( $id = 1; $id <= $maxID; $id++ ) {
+ if ( $id % $reportingInterval == 0 ) {
+ printf( "%-8d %-5.2f%%\r", $id, $id / $maxID * 100 );
+ }
+ $revision = Revision::loadFromPageId( $dbr, $id );
+ if ( $revision ) {
+ $text = ContentHandler::getContentText( $revision->getContent() );
+ if ( $text ) {
+ foreach ( $regexes as $regex ) {
+ if ( preg_match( $regex, $text, $matches ) ) {
+ $title = $revision->getTitle();
+ $titleText = $title->getPrefixedText();
+ if ( $dryRun ) {
+ $this->output( "Found spam in [[$titleText]]\n" );
+ } else {
+ $this->output( "Cleaning up links to {$matches[0]} in [[$titleText]]\n" );
+ $match = str_replace( 'http://', '', $matches[0] );
+ $this->cleanupArticle( $revision, $regexes, $match, $user );
+ }
+ }
+ }
+ }
+ }
+ }
+ // Just for satisfaction
+ printf( "%-8d %-5.2f%%\n", $id - 1, ( $id - 1 ) / $maxID * 100 );
+ }
+
+ /**
+ * Find the latest revision of the article that does not contain spam and revert to it
+ * @param Revision $rev
+ * @param array $regexes
+ * @param array $match
+ * @param User $user
+ */
+ private function cleanupArticle( Revision $rev, $regexes, $match, User $user ) {
+ $title = $rev->getTitle();
+ while ( $rev ) {
+ $matches = false;
+ foreach ( $regexes as $regex ) {
+ $matches = $matches
+ || preg_match(
+ $regex,
+ ContentHandler::getContentText( $rev->getContent() )
+ );
+ }
+ if ( !$matches ) {
+ // Didn't find any spam
+ break;
+ }
+
+ $rev = $rev->getPrevious();
+ }
+ if ( !$rev ) {
+ // Didn't find a non-spammy revision, blank the page
+ $this->output( "All revisions are spam, blanking...\n" );
+ $text = '';
+ $comment = "All revisions matched the spam blacklist ($match), blanking";
+ } else {
+ // Revert to this revision
+ $text = ContentHandler::getContentText( $rev->getContent() );
+ $comment = "Cleaning up links to $match";
+ }
+ $wikiPage = new WikiPage( $title );
+ $wikiPage->doEditContent(
+ ContentHandler::makeContent( $text, $title ), $comment,
+ 0, false, $user
+ );
+ }
+}
+
+$maintClass = Cleanup::class;
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/www/wiki/extensions/SpamBlacklist/phpcs.xml b/www/wiki/extensions/SpamBlacklist/phpcs.xml
new file mode 100644
index 00000000..2d89b6f8
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/phpcs.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleset>
+ <rule ref="./vendor/mediawiki/mediawiki-codesniffer/MediaWiki">
+ <exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationProtected" />
+ <exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic" />
+ <exclude name="MediaWiki.Commenting.FunctionComment.MissingParamComment" />
+ <exclude name="MediaWiki.Commenting.FunctionComment.MissingParamName" />
+ <exclude name="MediaWiki.Commenting.FunctionComment.MissingParamTag" />
+ <exclude name="MediaWiki.Commenting.FunctionComment.MissingReturn" />
+ <exclude name="MediaWiki.Commenting.FunctionComment.ParamNameNoMatch" />
+ <exclude name="MediaWiki.Files.ClassMatchesFilename.NotMatch" />
+ <exclude name="MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment"/>
+ </rule>
+ <rule ref="MediaWiki.NamingConventions.ValidGlobalName">
+ <properties>
+ <property name="ignoreList" type="array" value="$messageMemc" />
+ </properties>
+ </rule>
+ <rule ref="MediaWiki.NamingConventions.PrefixedGlobalFunctions">
+ <properties>
+ <property name="ignoreList" type="array" value="cleanupArticle" />
+ </properties>
+ </rule>
+ <file>.</file>
+ <arg name="extensions" value="php,php5,inc"/>
+ <arg name="encoding" value="UTF-8"/>
+</ruleset>
diff --git a/www/wiki/extensions/SpamBlacklist/tests/phan/config.php b/www/wiki/extensions/SpamBlacklist/tests/phan/config.php
new file mode 100644
index 00000000..467f0c27
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/tests/phan/config.php
@@ -0,0 +1,19 @@
+<?php
+
+$cfg = require __DIR__ . '/../../vendor/mediawiki/mediawiki-phan-config/src/config.php';
+$cfg['directory_list'] = array_merge(
+ $cfg['directory_list'],
+ [
+ './../../extensions/CheckUser',
+ './../../extensions/EventLogging',
+ ]
+);
+$cfg['exclude_analysis_directory_list'] = array_merge(
+ $cfg['exclude_analysis_directory_list'],
+ [
+ './../../extensions/CheckUser',
+ './../../extensions/EventLogging',
+ ]
+);
+
+return $cfg;
diff --git a/www/wiki/extensions/SpamBlacklist/tests/phpunit/BaseBlacklistTest.php b/www/wiki/extensions/SpamBlacklist/tests/phpunit/BaseBlacklistTest.php
new file mode 100644
index 00000000..634a266d
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/tests/phpunit/BaseBlacklistTest.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @covers BaseBlacklist
+ */
+class BaseBlacklistTest extends MediaWikiTestCase {
+
+ /**
+ * @return array
+ */
+ public static function provideGetTypeFromTitle() {
+ return [
+ [ 'MediaWiki:Spam-blacklist', 'spam' ],
+ [ 'MediaWiki:Spam-whitelist', 'spam' ],
+ [ 'MediaWiki:Email-whitelist', 'email' ],
+ [ 'MediaWiki:Email-blacklist', 'email' ],
+ [ 'MediaWiki:A random page', false ],
+ [ 'Another random page', false ],
+ ];
+ }
+
+ /**
+ * @dataProvider provideGetTypeFromTitle
+ * @param string $title
+ * @param string|bool $expected
+ */
+ public function testGetTypeFromTitle( $title, $expected ) {
+ $title = Title::newFromText( $title );
+ $output = BaseBlacklist::getTypeFromTitle( $title );
+ $this->assertEquals( $expected, $output );
+ }
+}
diff --git a/www/wiki/extensions/SpamBlacklist/tests/phpunit/SpamBlacklistTest.php b/www/wiki/extensions/SpamBlacklist/tests/phpunit/SpamBlacklistTest.php
new file mode 100644
index 00000000..7558cfda
--- /dev/null
+++ b/www/wiki/extensions/SpamBlacklist/tests/phpunit/SpamBlacklistTest.php
@@ -0,0 +1,91 @@
+<?php
+
+/**
+ * @group SpamBlacklist
+ */
+class SpamBlacklistTest extends MediaWikiTestCase {
+ /**
+ * @var SpamBlacklist
+ */
+ protected $spamFilter;
+
+ /**
+ * Spam blacklist regexes. Examples taken from:
+ *
+ * @see http://meta.wikimedia.org/wiki/Spam_blacklist
+ * @see http://en.wikipedia.org/wiki/MediaWiki:Spam-blacklist
+ *
+ * via Flow extension
+ *
+ * @var array
+ */
+ protected $blacklist = [ '\b01bags\.com\b', 'sytes\.net' ];
+
+ /**
+ * Spam whitelist regexes. Examples taken from:
+ *
+ * @see http://en.wikipedia.org/wiki/MediaWiki:Spam-whitelist
+ *
+ * via Flow extension
+ *
+ * @var array
+ */
+ protected $whitelist = [ 'a5b\.sytes\.net' ];
+
+ public function spamProvider() {
+ return [
+ 'no spam' => [
+ [ 'https://example.com' ],
+ false,
+ ],
+ 'revision with spam, with additional non-spam' => [
+ [ 'https://foo.com', 'http://01bags.com', 'http://bar.com' ],
+ [ '01bags.com' ],
+ ],
+
+ 'revision with spam using full width stop normalization' => [
+ [ 'http://01bags.com' ],
+ [ '01bags.com' ],
+ ],
+
+ 'revision with domain blacklisted as spam, but subdomain whitelisted' => [
+ [ 'http://a5b.sytes.net' ],
+ false,
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider spamProvider
+ */
+ public function testSpam( $links, $expected ) {
+ $returnValue = $this->spamFilter->filter( $links, Title::newMainPage() );
+ $this->assertEquals( $expected, $returnValue );
+ }
+
+ protected function setUp() {
+ parent::setUp();
+
+ // create spam filter
+ $this->spamFilter = new SpamBlacklist;
+
+ $this->setMwGlobals( 'wgBlacklistSettings', [
+ 'files' => [],
+ ] );
+
+ \MessageCache::singleton()->enable();
+ $this->insertPage( 'MediaWiki:Spam-blacklist', implode( "\n", $this->blacklist ) );
+ $this->insertPage( 'MediaWiki:Spam-whitelist', implode( "\n", $this->whitelist ) );
+
+ // That only works if the spam blacklist is really reset
+ $instance = BaseBlacklist::getInstance( 'spam' );
+ $reflProp = new \ReflectionProperty( $instance, 'regexes' );
+ $reflProp->setAccessible( true );
+ $reflProp->setValue( $instance, false );
+ }
+
+ protected function tearDown() {
+ \MessageCache::singleton()->disable();
+ parent::tearDown();
+ }
+}