summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/ConfirmEdit/ReCaptcha
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/ConfirmEdit/ReCaptcha
first commit
Diffstat (limited to 'www/wiki/extensions/ConfirmEdit/ReCaptcha')
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/HTMLReCaptchaField.php51
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/HTMLSubmittedValueField.php31
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/ReCaptcha.class.php200
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/ReCaptcha.php14
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/ReCaptchaAuthenticationRequest.php38
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/extension.json25
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ar.json17
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ast.json20
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ba.json16
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/be-tarask.json22
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/bn.json13
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/br.json14
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/bs.json14
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/cs.json16
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/cy.json13
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/de-formal.json8
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/de.json23
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/dsb.json8
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/en.json19
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/es.json18
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/fa.json14
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/fi.json14
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/fr.json26
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/gl.json22
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/gsw.json13
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/he.json15
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/hsb.json13
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/hu.json16
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ia.json20
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/id.json13
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/it.json22
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ja.json20
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ko.json17
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ksh.json13
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/lb.json13
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/lij.json20
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/lt.json20
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/mk.json21
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ms.json13
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/mt.json13
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/nb.json13
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/nl-informal.json12
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/nl.json14
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/oc.json8
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/pl.json15
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/pms.json14
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/pt-br.json20
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/pt.json22
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/qqq.json23
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/roa-tara.json20
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ru.json24
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/si.json8
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/sr-ec.json15
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/sr-el.json13
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/sv.json20
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/sw.json13
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/te.json13
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/tl.json14
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/uk.json24
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/vi.json14
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/zh-hans.json24
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/zh-hant.json24
-rw-r--r--www/wiki/extensions/ConfirmEdit/ReCaptcha/recaptchalib.php274
63 files changed, 1559 insertions, 0 deletions
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/HTMLReCaptchaField.php b/www/wiki/extensions/ConfirmEdit/ReCaptcha/HTMLReCaptchaField.php
new file mode 100644
index 00000000..0859f066
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/HTMLReCaptchaField.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * Creates a ReCaptcha widget. Does not return any data; handling the data submitted by the
+ * widget is callers' responsibility.
+ */
+class HTMLReCaptchaField extends HTMLFormField {
+ /** @var string Public key parameter to be passed to ReCaptcha. */
+ protected $key;
+
+ /** @var string Theme parameter to be passed to ReCaptcha. */
+ protected $theme;
+
+ /** @var bool Use secure connection to ReCaptcha. */
+ protected $secure;
+
+ /** @var string Error returned by ReCaptcha in the previous round. */
+ protected $error;
+
+ /**
+ * Parameters:
+ * - key: (string, required) ReCaptcha public key
+ * - theme: (string, required) ReCaptcha theme
+ * - secure: (bool) Use secure connection to ReCaptcha
+ * - error: (string) ReCaptcha error from previous round
+ * @param array $params
+ */
+ public function __construct( array $params ) {
+ $params += [
+ 'secure' => true,
+ 'error' => null,
+ ];
+ parent::__construct( $params );
+
+ $this->key = $params['key'];
+ $this->theme = $params['theme'];
+ $this->secure = $params['secure'];
+ $this->error = $params['error'];
+ }
+
+ public function getInputHTML( $value ) {
+ $attribs = $this->getAttributes( [ 'tabindex' ] ) + [ 'theme' => $this->theme ];
+ $js = 'var RecaptchaOptions = ' . Xml::encodeJsVar( $attribs );
+ $widget = recaptcha_get_html( $this->key, $this->error, $this->secure );
+ return Html::inlineScript( $js ) . $widget;
+ }
+
+ public function skipLoadData( $request ) {
+ return true;
+ }
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/HTMLSubmittedValueField.php b/www/wiki/extensions/ConfirmEdit/ReCaptcha/HTMLSubmittedValueField.php
new file mode 100644
index 00000000..2c8d3cdf
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/HTMLSubmittedValueField.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * Do not generate any input element, just accept a value. How that value gets submitted is someone
+ * else's responsibility.
+ */
+class HTMLSubmittedValueField extends HTMLFormField {
+ public function getTableRow( $value ) {
+ return '';
+ }
+
+ public function getDiv( $value ) {
+ return '';
+ }
+
+ public function getRaw( $value ) {
+ return '';
+ }
+
+ public function getInputHTML( $value ) {
+ return '';
+ }
+
+ public function canDisplayErrors() {
+ return false;
+ }
+
+ public function hasVisibleOutput() {
+ return false;
+ }
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/ReCaptcha.class.php b/www/wiki/extensions/ConfirmEdit/ReCaptcha/ReCaptcha.class.php
new file mode 100644
index 00000000..a62633e0
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/ReCaptcha.class.php
@@ -0,0 +1,200 @@
+<?php
+
+use MediaWiki\Auth\AuthenticationRequest;
+
+class ReCaptcha extends SimpleCaptcha {
+ // used for recaptcha-edit, recaptcha-addurl, recaptcha-badlogin, recaptcha-createaccount,
+ // recaptcha-create, recaptcha-sendemail via getMessage()
+ protected static $messagePrefix = 'recaptcha-';
+
+ // reCAPTHCA error code returned from recaptcha_check_answer
+ private $recaptcha_error = null;
+
+ /**
+ * Displays the reCAPTCHA widget.
+ * If $this->recaptcha_error is set, it will display an error in the widget.
+ * @param int $tabIndex
+ * @return array
+ */
+ function getFormInformation( $tabIndex = 1 ) {
+ global $wgReCaptchaPublicKey, $wgReCaptchaTheme;
+
+ wfDeprecated( 'ConfirmEdit module ReCaptcha', '1.28' );
+ $useHttps = ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] == 'on' );
+ $js = 'var RecaptchaOptions = ' . Xml::encodeJsVar(
+ [ 'theme' => $wgReCaptchaTheme, 'tabindex' => $tabIndex ]
+ );
+
+ return [
+ 'html' => Html::inlineScript( $js ) .
+ recaptcha_get_html( $wgReCaptchaPublicKey, $this->recaptcha_error, $useHttps )
+ ];
+ }
+
+ /**
+ * @param WebRequest $request
+ * @return array
+ */
+ protected function getCaptchaParamsFromRequest( WebRequest $request ) {
+ // API is hardwired to return captchaId and captchaWord,
+ // so use that if the standard two are empty
+ $challenge = $request->getVal( 'recaptcha_challenge_field', $request->getVal( 'captchaId' ) );
+ $response = $request->getVal( 'recaptcha_response_field', $request->getVal( 'captchaWord' ) );
+ return [ $challenge, $response ];
+ }
+
+ /**
+ * Calls the library function recaptcha_check_answer to verify the users input.
+ * Sets $this->recaptcha_error if the user is incorrect.
+ * @param string $challenge Challenge value
+ * @param string $response Response value
+ * @return bool
+ */
+ function passCaptcha( $challenge, $response ) {
+ global $wgReCaptchaPrivateKey, $wgRequest;
+
+ if ( $response === null ) {
+ // new captcha session
+ return false;
+ }
+
+ $ip = $wgRequest->getIP();
+
+ $recaptcha_response =
+ recaptcha_check_answer( $wgReCaptchaPrivateKey, $ip, $challenge, $response );
+
+ if ( !$recaptcha_response->is_valid ) {
+ $this->recaptcha_error = $recaptcha_response->error;
+ return false;
+ }
+
+ $recaptcha_error = null;
+
+ return true;
+ }
+
+ /**
+ * @param array &$resultArr
+ */
+ function addCaptchaAPI( &$resultArr ) {
+ $resultArr['captcha'] = $this->describeCaptchaType();
+ $resultArr['captcha']['error'] = $this->recaptcha_error;
+ }
+
+ /**
+ * @return array
+ */
+ public function describeCaptchaType() {
+ global $wgReCaptchaPublicKey;
+ return [
+ 'type' => 'recaptcha',
+ 'mime' => 'image/png',
+ 'key' => $wgReCaptchaPublicKey,
+ ];
+ }
+
+ /**
+ * @param ApiBase &$module
+ * @param array &$params
+ * @param int $flags
+ * @return bool
+ */
+ public function APIGetAllowedParams( &$module, &$params, $flags ) {
+ if ( $flags && $this->isAPICaptchaModule( $module ) ) {
+ $params['recaptcha_challenge_field'] = [
+ ApiBase::PARAM_HELP_MSG => 'recaptcha-apihelp-param-recaptcha_challenge_field',
+ ];
+ $params['recaptcha_response_field'] = [
+ ApiBase::PARAM_HELP_MSG => 'recaptcha-apihelp-param-recaptcha_response_field',
+ ];
+ }
+
+ return true;
+ }
+
+ /**
+ * @return null
+ */
+ public function getError() {
+ // do not treat failed captcha attempts as errors
+ if ( in_array( $this->recaptcha_error, [
+ 'invalid-request-cookie', 'incorrect-captcha-sol',
+ ], true ) ) {
+ return null;
+ }
+
+ return $this->recaptcha_error;
+ }
+
+ public function storeCaptcha( $info ) {
+ // ReCaptcha is stored by Google; the ID will be generated at that time as well, and
+ // the one returned here won't be used. Just pretend this worked.
+ return 'not used';
+ }
+
+ public function retrieveCaptcha( $index ) {
+ // just pretend it worked
+ return [ 'index' => $index ];
+ }
+
+ public function getCaptcha() {
+ // ReCaptcha is handled by frontend code + an external provider; nothing to do here.
+ return [];
+ }
+
+ /**
+ * @param array $captchaData
+ * @param string $id
+ * @return Message
+ */
+ public function getCaptchaInfo( $captchaData, $id ) {
+ return wfMessage( 'recaptcha-info' );
+ }
+
+ /**
+ * @return ReCaptchaAuthenticationRequest
+ */
+ public function createAuthenticationRequest() {
+ return new ReCaptchaAuthenticationRequest();
+ }
+
+ /**
+ * @param array $requests
+ * @param array $fieldInfo
+ * @param array &$formDescriptor
+ * @param string $action
+ */
+ public function onAuthChangeFormFields(
+ array $requests, array $fieldInfo, array &$formDescriptor, $action
+ ) {
+ global $wgReCaptchaPublicKey, $wgReCaptchaTheme;
+
+ $req = AuthenticationRequest::getRequestByClass( $requests,
+ CaptchaAuthenticationRequest::class, true );
+ if ( !$req ) {
+ return;
+ }
+
+ // ugly way to retrieve error information
+ $captcha = ConfirmEditHooks::getInstance();
+
+ $formDescriptor['captchaInfo'] = [
+ 'class' => HTMLReCaptchaField::class,
+ 'key' => $wgReCaptchaPublicKey,
+ 'theme' => $wgReCaptchaTheme,
+ 'secure' => isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] === 'on',
+ 'error' => $captcha->getError(),
+ ] + $formDescriptor['captchaInfo'];
+
+ // the custom form element cannot return multiple fields; work around that by
+ // "redirecting" ReCaptcha names to standard names
+ $formDescriptor['captchaId'] = [
+ 'class' => HTMLSubmittedValueField::class,
+ 'name' => 'recaptcha_challenge_field',
+ ];
+ $formDescriptor['captchaWord'] = [
+ 'class' => HTMLSubmittedValueField::class,
+ 'name' => 'recaptcha_response_field',
+ ];
+ }
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/ReCaptcha.php b/www/wiki/extensions/ConfirmEdit/ReCaptcha/ReCaptcha.php
new file mode 100644
index 00000000..4d88d107
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/ReCaptcha.php
@@ -0,0 +1,14 @@
+<?php
+if ( function_exists( 'wfLoadExtension' ) ) {
+ wfLoadExtension( 'ConfirmEdit/ReCaptcha' );
+ // Keep i18n globals so mergeMessageFileList.php doesn't break
+ $wgMessagesDirs['ReCaptcha'] = __DIR__ . '/i18n';
+ /* wfWarn(
+ 'Deprecated PHP entry point used for ReCaptcha extension. ' .
+ 'Please use wfLoadExtension instead, ' .
+ 'see https://www.mediawiki.org/wiki/Extension_registration for more details.'
+ ); */
+ return;
+} else {
+ die( 'This version of the Re^Captcha extension requires MediaWiki 1.25+' );
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/ReCaptchaAuthenticationRequest.php b/www/wiki/extensions/ConfirmEdit/ReCaptcha/ReCaptchaAuthenticationRequest.php
new file mode 100644
index 00000000..5455ea79
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/ReCaptchaAuthenticationRequest.php
@@ -0,0 +1,38 @@
+<?php
+
+use MediaWiki\Auth\AuthenticationRequest;
+
+/**
+ * Authentication request for ReCaptcha v1. Unlike the parent class, no session storage is used;
+ * that's handled by Google.
+ */
+class ReCaptchaAuthenticationRequest extends CaptchaAuthenticationRequest {
+ public function __construct() {
+ parent::__construct( null, null );
+ }
+
+ public function loadFromSubmission( array $data ) {
+ // unhack the hack in parent
+ return AuthenticationRequest::loadFromSubmission( $data );
+ }
+
+ public function getFieldInfo() {
+ $fieldInfo = parent::getFieldInfo();
+ if ( !$fieldInfo ) {
+ return false;
+ }
+
+ return array_merge( $fieldInfo, [
+ 'captchaId' => [
+ 'type' => 'string',
+ 'label' => wfMessage( 'recaptcha-id-label' ),
+ 'help' => wfMessage( 'recaptcha-id-help' ),
+ ],
+ 'captchaWord' => [
+ 'type' => 'string',
+ 'label' => wfMessage( 'recaptcha-label' ),
+ 'help' => wfMessage( 'recaptcha-help' ),
+ ],
+ ] );
+ }
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/extension.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/extension.json
new file mode 100644
index 00000000..e3a4f128
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/extension.json
@@ -0,0 +1,25 @@
+{
+ "name": "ReCaptcha",
+ "ExtensionFunctions": [
+ "ConfirmEditHooks::efReCaptcha"
+ ],
+ "MessagesDirs": {
+ "ReCaptcha": [
+ "i18n"
+ ]
+ },
+ "AutoloadClasses": {
+ "ReCaptcha": "ReCaptcha.class.php",
+ "HTMLReCaptchaField": "HTMLReCaptchaField.php",
+ "HTMLSubmittedValueField": "HTMLSubmittedValueField.php",
+ "ReCaptchaAuthenticationRequest": "ReCaptchaAuthenticationRequest.php"
+ },
+ "config": {
+ "CaptchaClass": "ReCaptcha",
+ "ReCaptchaPublicKey": "",
+ "ReCaptchaPrivateKey": "",
+ "ReCaptchaTheme": "red"
+ },
+ "callback": "ConfirmEditHooks::onReCaptchaSetup",
+ "manifest_version": 1
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ar.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ar.json
new file mode 100644
index 00000000..27da5763
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ar.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "Alexknight12",
+ "Ciphers",
+ "Meno25",
+ "ديفيد"
+ ]
+ },
+ "recaptcha-desc": "موديل reCAPTCHA لConfirm Edit",
+ "recaptcha-edit": "لحماية الويكي من السبام الآلي; نطلب منك كتابة الكلمات التي تراها في المربع.",
+ "recaptcha-addurl": "إن تعديلك يتضمن وصلات خارجية جديدة، لحماية الويكي من السبام الآلي; نطلب منك كتابة الكلمات التي تراها في المربع.",
+ "recaptcha-badlogin": "لتحمي الويكي من تكسير كلمة المرور الآلي; نطلب منك كتابة الكلمات التي تراها في المربع.",
+ "recaptcha-createaccount": "لتحمي الويكي من الإنشاء الآلي للحسابات; نطلب منك كتابة الكلمات التي تراها في المربع.",
+ "recaptcha-createaccount-fail": "جواب reCAPTCHA غير صحيح أو مفقود.",
+ "recaptcha-create": "لتحمي الويكي من الإنشاء الآلي للصفحات; نطلب منك كتابة الكلمات التي تراها في المربع."
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ast.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ast.json
new file mode 100644
index 00000000..b429f4b1
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ast.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Xuacu"
+ ]
+ },
+ "recaptcha-edit": "Pa protexer la wiki contra'l spam automáticu, te pidimos qu'escribas los dos palabres que ves nel cuadru siguiente:",
+ "recaptcha-addurl": "La to edición incluye enllaces esternos nuevos. Pa protexer la wiki contra'l spam automatizáu, te pidimos qu'escribas les palabres que ves nel cuadru siguiente:",
+ "recaptcha-badlogin": "Pa protexer la wiki contra'l descifráu automatizáu de contraseñes, te pidimos qu'escribas los dos palabres que ves nel cuadru siguiente:",
+ "recaptcha-createaccount": "Pa protexer la wiki contra la creación automatizada de cuentes, te pidimos qu'escribas les palabres que ves nel cuadru siguiente:",
+ "recaptcha-createaccount-fail": "Falta la rempuesta a la entruga de reCAPTCHA o ye incorreuta",
+ "recaptcha-create": "Pa protexer la wiki contra la creación automatizada de páxines, te pidimos qu'escribas les palabres que ves nel cuadru siguiente:",
+ "recaptcha-info": "Resuelve'l retu ReCaptcha y devuelve los valores de pregunta y respuesta como captchaId y captchaWord.",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "Campu del widget ReCaptcha",
+ "recaptcha-apihelp-param-recaptcha_response_field": "Campu del widget ReCaptcha",
+ "recaptcha-id-label": "Retu ReCaptcha",
+ "recaptcha-id-help": "Valor del retu ReCaptcha",
+ "recaptcha-label": "Solución del ReCaptcha",
+ "recaptcha-help": "Valor de la solución del ReCaptcha"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ba.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ba.json
new file mode 100644
index 00000000..24ff409f
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ba.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Sagan",
+ "Лилиә"
+ ]
+ },
+ "recaptcha-edit": "Спамдан һаҡланыу өсөн ике һүҙҙе яҙыуығыҙҙы һорайбыҙ:",
+ "recaptcha-addurl": "Һеҙҙең төҙәтеүҙә тышҡы һылтанма бар. Спамдан һаҡланыу өсөн ике һүҙҙе яҙыуығыҙҙы һорайбыҙ:",
+ "recaptcha-badlogin": "Автоматик рәүештә пароль һайлап алыуҙан һаҡланыу өсөн ике һүҙҙе яҙыуығыҙҙы һорайбыҙ:",
+ "recaptcha-createaccount": "Автоматик рәүештә иҫәп яҙмаһы булдырыуҙан һаҡланыу өсөн түбәндәге ике һүҙҙе яҙыуығыҙҙы һорайбыҙ:",
+ "recaptcha-createaccount-fail": "reCAPTCHA яуабы дөрөҫ түгел йәки юҡ.",
+ "recaptcha-create": "Автоматик рәүештә биттәр булдырыуҙан һаҡланыу өсөн түбәндәге ике һүҙҙе яҙыуығыҙҙы һорайбыҙ:",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "ReCaptcha виджитендағы ялан",
+ "recaptcha-apihelp-param-recaptcha_response_field": "ReCaptcha виджитындағы ялан"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/be-tarask.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/be-tarask.json
new file mode 100644
index 00000000..b4ead0ae
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/be-tarask.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "EugeneZelenko",
+ "Jim-by",
+ "Red Winged Duck"
+ ]
+ },
+ "recaptcha-edit": "Для абароны вікі ад аўтаматычнага спаму ў праўках, мы просім вас увесьці словы, якія вы бачыце ў полі.",
+ "recaptcha-addurl": "Вашае рэдагаваньне ўтрымлівае новыя вонкавыя спасылкі. Для абароны вікі ад аўтаматызаванага спаму, мы просім вас увесьці словы, якія вы бачыце ў полі.",
+ "recaptcha-badlogin": "Для абароны вікі ад аўтаматызаванага ўзлому паролю, мы просім вас увесьці словы, якія вы бачыце ў полі.",
+ "recaptcha-createaccount": "Для абароны вікі ад аўтаматычнага стварэньня рахункаў, мы просім вас увесьці словы, якія вы бачыце ў полі.",
+ "recaptcha-createaccount-fail": "Адказ reCAPTCHA няслушны ці адсутнічае.",
+ "recaptcha-create": "Для абароны вікі ад аўтаматычнага стварэньня старонак, мы просім вас увесьці словы, якія вы бачыце ў полі.",
+ "recaptcha-info": "Калі ласка, разьвяжыце заданьне ReCaptcha і вярніце заданьне і адказы ў выглядзе captchaId і captchaWord.",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "Поле зь віджэту ReCaptcha",
+ "recaptcha-apihelp-param-recaptcha_response_field": "Поле зь віджэту ReCaptcha",
+ "recaptcha-id-label": "Заданьне ReCaptcha",
+ "recaptcha-id-help": "Значэньне заданьня ReCaptcha",
+ "recaptcha-label": "Разьвязаньне ReCaptcha",
+ "recaptcha-help": "Значэньне разьвязаньня ReCaptcha"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/bn.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/bn.json
new file mode 100644
index 00000000..bcd27c8e
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/bn.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Aftabuzzaman"
+ ]
+ },
+ "recaptcha-edit": "স্বয়ংক্রিয়ভাবে সম্পাদনা স্প্যামের বিরুদ্ধে উইকিকে রক্ষা করার জন্য, আমরা আপনাকে বাক্সের মধ্যে যে শব্দগুলি দেখতে পাচ্ছেন তা লেখার অনুরোধ করছি।",
+ "recaptcha-addurl": "আপনার সম্পাদনায় নতুন বাহ্যিক লিঙ্ক অন্তর্ভুক্ত করা হয়েছে। স্বয়ংক্রিয়ভাবে স্প্যামের বিরুদ্ধে উইকিকে রক্ষা করার জন্য, আমরা আপনাকে বাক্সের মধ্যে যে শব্দগুলি দেখতে পাচ্ছেন তা লেখার অনুরোধ করছি।",
+ "recaptcha-badlogin": "স্বয়ংক্রিয়ভাবে পাসওয়ার্ড ভাঙ্গার বিরুদ্ধে উইকিকে রক্ষা করার জন্য, আমরা আপনাকে বাক্সের মধ্যে যে শব্দগুলি দেখতে পাচ্ছেন তা লেখার অনুরোধ করছি।",
+ "recaptcha-createaccount": "স্বয়ংক্রিয়ভাবে অ্যাকাউন্ট সৃষ্টিকরণের বিরুদ্ধে উইকিকে রক্ষা করার জন্য, আমরা আপনাকে বাক্সের মধ্যে যে শব্দগুলি দেখতে পাচ্ছেন তা লেখার অনুরোধ করছি।",
+ "recaptcha-createaccount-fail": "reCAPTCHA-এর উত্তর ভুল অথবা অনুপস্থিত।",
+ "recaptcha-create": "স্বয়ংক্রিয়ভাবে পাতা সৃষ্টিকরণের বিরুদ্ধে উইকিকে রক্ষা করার জন্য, আমরা আপনাকে বাক্সের মধ্যে যে শব্দগুলি দেখতে পাচ্ছেন তা লেখার অনুরোধ করছি।"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/br.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/br.json
new file mode 100644
index 00000000..9f2a54e9
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/br.json
@@ -0,0 +1,14 @@
+{
+ "@metadata": {
+ "authors": [
+ "Fohanno",
+ "Fulup"
+ ]
+ },
+ "recaptcha-edit": "Evit sikour en em wareziñ diouzh ar stroboù emgefre, merkit an daou c'her a welit er voest dindan :",
+ "recaptcha-addurl": "Liamm diavaez nevez zo bet degaset ganeoc'h. Evit sikour en em wareziñ diouzh ar stroboù, merkit an daou c'her a welit er voest dindan :",
+ "recaptcha-badlogin": "Evit sikour da wareziñ ar wiki diouzh an diskuliañ gerioù-tremen emgefre dre daolioù-esae, merkit an daou c'her a welit er voest dindan :",
+ "recaptcha-createaccount": "Evit sikour d'en em wareziñ diouzh ar c'hrouiñ kontoù emgefre, merkit an daou c'her a welit er voest dindan :",
+ "recaptcha-createaccount-fail": "Respont reCAPTHCA faziek pe ezvezant.",
+ "recaptcha-create": "Evit sikour d'en em wareziñ diouzh ar c'hrouiñ pajennoù emgefre, merkit an daou c'her a welit er voest dindan :"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/bs.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/bs.json
new file mode 100644
index 00000000..1c4aaa52
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/bs.json
@@ -0,0 +1,14 @@
+{
+ "@metadata": {
+ "authors": [
+ "CERminator",
+ "Srdjan m"
+ ]
+ },
+ "recaptcha-edit": "U cilju zaštite wikija od automatiziranog postavljanja neželjenog sadržaja, molimo Vas da upišite riječi koje vidite u kutiju ispod.",
+ "recaptcha-addurl": "Vaše izmjene uključuju nove vanjske linkove. U cilju zaštite wikija od automatiziranog neželjenog sadržaja, molimo Vas da upišite riječi koje vidite u kutiju ispod.",
+ "recaptcha-badlogin": "U cilju zaštite wikija od automatiziranog probijanja lozinki, molimo Vas da upišite riječi koje vidite u kutiju ispod.",
+ "recaptcha-createaccount": "U cilju zaštite wikija od automatiziranog pravljenja računa, molimo Vas da upišite riječi koje vidite u kutiju ispod.",
+ "recaptcha-createaccount-fail": "Neispravan ili nedostajući reCAPTCHA odgovor.",
+ "recaptcha-create": "U cilju zaštite wikija od automatiziranog pravljenja stranica, molimo Vas da upišite riječi koje vidite u kutiju ispod."
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/cs.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/cs.json
new file mode 100644
index 00000000..a97e66c5
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/cs.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jkjk",
+ "Mormegil"
+ ]
+ },
+ "recaptcha-desc": "Podpora reCAPTCHA pro rozšíření Confirm Edit",
+ "recaptcha-edit": "V zájmu ochrany této wiki před automatickým spamováním vás prosíme o opsání slov, která vidíte v rámečku.",
+ "recaptcha-addurl": "Vaše editace obsahuje nové externí odkazy. V zájmu ochrany této wiki před automatickým spamováním vás prosíme o opsání slov, která vidíte v rámečku.",
+ "recaptcha-badlogin": "V zájmu ochrany této wiki proti automatickým pokusům uhodnout heslo vás prosíme o opsání slov, která vidíte v rámečku.",
+ "recaptcha-createaccount": "V zájmu ochrany této wiki před automatickým vytvářením účtů vás prosíme o opsání slov, která vidíte v rámečku.",
+ "recaptcha-createaccount-fail": "Nesprávná nebo chybějící odpověď na reCAPTCHA.",
+ "recaptcha-create": "V zájmu ochrany před automatickým zakládáním stránek vás prosíme o opsání slov, která vidíte v rámečku.",
+ "recaptcha-info": "Vyřešte výzvu ReCaptcha a vraťte hodnoty výzvy a odpovědi jako captchaId a captchaWord."
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/cy.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/cy.json
new file mode 100644
index 00000000..27cef7cc
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/cy.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Lloffiwr"
+ ]
+ },
+ "recaptcha-edit": "Er mwyn arbed y wici rhag i olygyddion awtomatig osod sbam, byddwch gystal â theipio'r ddau air sydd i'w gweld yn y blwch isod:",
+ "recaptcha-addurl": "Mae'ch golygiad yn cynnwys cysylltiadau allanol newydd. Er mwyn arbed y wici rhag sbam awtomatig, byddwch gystal â theipio'r ddau air sydd i'w gweld yn y blwch isod:",
+ "recaptcha-badlogin": "Er mwyn arbed y wici rhag peiriannau sy'n datrys cyfrineiriau'n awtomatig, byddwch gystal â theipio'r ddau air sydd i'w gweld yn y blwch isod:",
+ "recaptcha-createaccount": "Er mwyn arbed y wici rhag peiriannau sy'n dechrau cyfrifon yn awtomatig, byddwch gystal â theipio'r ddau air sydd i'w gweld yn y blwch isod:",
+ "recaptcha-createaccount-fail": "Mae'r ateb i'r pos CAPTCHA yn anghywir neu yn eisiau.",
+ "recaptcha-create": "Er mwyn arbed y wici rhag peiriannau sy'n dechrau tudalennau yn awtomatig, byddwch gystal â theipio'r ddau air sydd i'w gweld yn y blwch isod:"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/de-formal.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/de-formal.json
new file mode 100644
index 00000000..aacaf4f5
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/de-formal.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kghbln"
+ ]
+ },
+ "recaptcha-createaccount": "Zum Schutz gegen die automatisierte Erstellung von Benutzerkonten bitten wir Sie, die folgenden beiden Wörter in das untenstehende Feld einzugeben:"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/de.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/de.json
new file mode 100644
index 00000000..8b15a6d5
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/de.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kghbln",
+ "Metalhead64",
+ "Umherirrender"
+ ]
+ },
+ "recaptcha-desc": "reCAPTCHA-Module für die Erweiterung „Confirm Edit“",
+ "recaptcha-edit": "Zum Schutz des Wikis vor automatisiertem Spam bitten wir dich, die folgenden Wörter in das untenstehende Feld einzugeben:",
+ "recaptcha-addurl": "Deine Bearbeitung enthält neue externe Links. Zum Schutz des Wikis vor automatisiertem Spam bitten wir dich, die folgenden Wörter in das folgende Feld einzugeben:",
+ "recaptcha-badlogin": "Zum Schutz des Wikis gegen automatisiertes Knacken von Passwörtern bitten wir dich, die folgenden Wörter in das folgende Feld einzugeben:",
+ "recaptcha-createaccount": "Zum Schutz des Wikis gegen die automatisierte Erstellung von Benutzerkonten bitten wir dich, die folgenden Wörter in das untenstehende Feld einzugeben:",
+ "recaptcha-createaccount-fail": "Fehlerhafte oder fehlende reCAPTCHA Antwort.",
+ "recaptcha-create": "Zum Schutz des Wikis gegen automatisierte Erstellung von Seiten bitten wir dich, die folgenden Wörter in das folgende Feld einzugeben:",
+ "recaptcha-info": "Bitte löse eine ReCaptcha-Herausforderung und gib die Herausforderungs- und Antwortwerte als captchaId und captchaWord zurück.",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "Feld von dem ReCaptcha-Widget",
+ "recaptcha-apihelp-param-recaptcha_response_field": "Feld von dem ReCaptcha-Widget",
+ "recaptcha-id-label": "ReCaptcha-Herausforderung",
+ "recaptcha-id-help": "Wert der ReCaptcha-Herausforderung",
+ "recaptcha-label": "ReCaptcha-Lösung",
+ "recaptcha-help": "Wert der ReCaptcha-Lösung"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/dsb.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/dsb.json
new file mode 100644
index 00000000..546db343
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/dsb.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Michawiki"
+ ]
+ },
+ "recaptcha-createaccount-fail": "Wopacne abo felujuce wótegrono reCAPTCHA."
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/en.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/en.json
new file mode 100644
index 00000000..c600bc6a
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/en.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": []
+ },
+ "recaptcha-desc": "reCAPTCHA module for Confirm Edit",
+ "recaptcha-edit": "To protect the wiki against automated edit spam, we kindly ask you to type the words you see in the box.",
+ "recaptcha-addurl": "Your edit includes new external links. To protect the wiki against automated spam, we kindly ask you to type the words you see in the box.",
+ "recaptcha-badlogin": "To protect the wiki against automated password cracking, we kindly ask you to type the words you see in the box.",
+ "recaptcha-createaccount": "To protect the wiki against automated account creation, we kindly ask you to type the words you see in the box.",
+ "recaptcha-createaccount-fail": "Incorrect or missing reCAPTCHA answer.",
+ "recaptcha-create": "To protect the wiki against automated page creation, we kindly ask you to type the words you see in the box.",
+ "recaptcha-info": "Please solve a ReCaptcha challenge and return the challenge and response values as captchaId and captchaWord.",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "Field from the ReCaptcha widget",
+ "recaptcha-apihelp-param-recaptcha_response_field": "Field from the ReCaptcha widget",
+ "recaptcha-id-label": "ReCaptcha challenge",
+ "recaptcha-id-help": "ReCaptcha challenge value",
+ "recaptcha-label": "ReCaptcha solution",
+ "recaptcha-help": "ReCaptcha solution value"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/es.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/es.json
new file mode 100644
index 00000000..d54337dd
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/es.json
@@ -0,0 +1,18 @@
+{
+ "@metadata": {
+ "authors": [
+ "Fitoschido",
+ "Sporeunai",
+ "Macofe",
+ "Rubentl134",
+ "Dgstranz"
+ ]
+ },
+ "recaptcha-edit": "Para proteger el wiki contra el spam automatizado, te pedimos que escribas las dos palabras que ves en el cuadro.",
+ "recaptcha-addurl": "Tu edición incluye enlaces externos nuevos. Para proteger el wiki contra el spam automatizado, te pedimos que escribas las palabras que ves en el cuadro.",
+ "recaptcha-badlogin": "Para proteger el wiki contra el descifrado automatizado de contraseñas, te pedimos que escribas las dos palabras que ves en el cuadro.",
+ "recaptcha-createaccount": "Para proteger el wiki contra la creación automatizada de cuentas, te pedimos que escribas las palabras que ves en el cuadro.",
+ "recaptcha-createaccount-fail": "ReCAPTCHA incorrecto o sin responder.",
+ "recaptcha-create": "Para proteger el wiki contra la creación automatizada de páginas, te pedimos que escribas las palabras que ves en el cuadro.",
+ "recaptcha-id-label": "Reto ReCaptcha"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/fa.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/fa.json
new file mode 100644
index 00000000..8e5e6ee1
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/fa.json
@@ -0,0 +1,14 @@
+{
+ "@metadata": {
+ "authors": [
+ "Armin1392",
+ "Ebraminio"
+ ]
+ },
+ "recaptcha-edit": "برای محافظت ویکی دربرابر ویرایش خودکار اسپم، ما دوستانه از شما درخواست می‌کنیم که دو کلمه‌ای را که در جعبهٔ زیر می‌بینید را بنویسید:",
+ "recaptcha-addurl": "ویرایش شما شامل پیوندهای خارجی جدید است. برای محافظت ویکی در برابر هرزنگاری خودکار، ما دوستانه از شما درخواست می‌کنیم که دو کلمه‌ای را که در جعبهٔ زیر می‌بینید را بنویسید:",
+ "recaptcha-badlogin": "برای محافظت ویکی دربرابر رخنهٔ رمز عبور به طور خودکار، ما دوستانه از شما درخواست می‌کنیم که دو کلمه‌ای را که در جعبهٔ زیر می‌بینید را بنویسید:",
+ "recaptcha-createaccount": "برای محافظت ویکی دربرابر ایجاد حساب به طور خودکار، ما دوستانه از شما درخواست می‌کنیم که دو کلمه‌ای را که در جعبهٔ زیر می‌بینید را بنویسید:",
+ "recaptcha-createaccount-fail": "پاسخ نادرست یا عدم وجود ری‌سی‌اِی‌پی‌تی‌سی‌اچ‌اِی.",
+ "recaptcha-create": "برای محافظت ویکی دربرابر ایجاد صفحه به طور خودکار، ما دوستانه از شما درخواست می‌کنیم که دو کلمه‌ای را که در جعبهٔ زیر می‌بینید را بنویسید:"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/fi.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/fi.json
new file mode 100644
index 00000000..59ef145a
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/fi.json
@@ -0,0 +1,14 @@
+{
+ "@metadata": {
+ "authors": [
+ "Nedergard",
+ "VezonThunder"
+ ]
+ },
+ "recaptcha-edit": "Suojana automaattisia roskamuokkauksia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:",
+ "recaptcha-addurl": "Muokkauksesi sisältää uusia ulkoisia linkkejä. Suojana automaattista roskapostia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:",
+ "recaptcha-badlogin": "Suojana automaattisia salasanamurtoja vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:",
+ "recaptcha-createaccount": "Suojana automaattista tunnusten luontia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:",
+ "recaptcha-createaccount-fail": "Väärä tai puuttuva reCAPTCHA-vastaus.",
+ "recaptcha-create": "Suojana automaattista sivujen luontia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/fr.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/fr.json
new file mode 100644
index 00000000..d9d35afe
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/fr.json
@@ -0,0 +1,26 @@
+{
+ "@metadata": {
+ "authors": [
+ "Gomoko",
+ "Urhixidur",
+ "Verdy p",
+ "Orlodrim",
+ "Wladek92",
+ "Yasten"
+ ]
+ },
+ "recaptcha-desc": "Module reCAPTCHA pour Confirm Edit",
+ "recaptcha-edit": "Afin de protéger le wiki contre les modifications automatiques des pourriels, nous vous demandons de bien vouloir écrire les mots que vous voyez dans le cadre.",
+ "recaptcha-addurl": "Votre modification contient de nouveaux liens vers des sites externes. Pour protéger le wiki contre le pourriel automatisé, nous vous demandons de bien vouloir écrire les mots que vous voyez dans le cadre.",
+ "recaptcha-badlogin": "Pour protéger le wiki contre les essais automatiques de découverte des mots de passe, nous vous demandons de bien vouloir écrire les mots que vous voyez dans le cadre.",
+ "recaptcha-createaccount": "Pour protéger le wiki des créations automatiques de compte, nous vous demandons de bien vouloir écrire les mots visibles dans le cadre.",
+ "recaptcha-createaccount-fail": "Réponse de reCAPTCHA fausse ou manquante.",
+ "recaptcha-create": "Pour protéger le wiki des créations automatiques de pages, nous vous demandons de bien vouloir écrire les mots visibles dans le cadre.",
+ "recaptcha-info": "Veuillez résoudre l'énigme ReCaptcha et retourner dans captchaId et captchaWord le test et les valeurs des réponses.",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "Champ du formulaire ReCaptcha",
+ "recaptcha-apihelp-param-recaptcha_response_field": "Champ du formulaire ReCaptcha",
+ "recaptcha-id-label": "Enigme ReCaptcha",
+ "recaptcha-id-help": "Valeur de l'énigme ReCaptcha",
+ "recaptcha-label": "Solution du ReCaptcha",
+ "recaptcha-help": "Valeur de la solution ReCaptcha"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/gl.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/gl.json
new file mode 100644
index 00000000..998acb4d
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/gl.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Toliño",
+ "Elisardojm"
+ ]
+ },
+ "recaptcha-desc": "Módulo de reCAPTCHA para Confirm Edit",
+ "recaptcha-edit": "Para protexer o wiki contra a publicidade automática, por favor, introduza as palabras que ve na caixa.",
+ "recaptcha-addurl": "A súa edición inclúe novas ligazóns externas. Para protexer o wiki contra a publicidade automática, por favor, introduza as palabras que ve na caixa.",
+ "recaptcha-badlogin": "Para protexer o wiki contra o roubo de contrasinais, por favor, introduza as palabras que ve na caixa.",
+ "recaptcha-createaccount": "Para protexer o wiki contra a creación automática de contas, por favor, introduza as palabras que ve na caixa.",
+ "recaptcha-createaccount-fail": "Falta a resposta ao reCAPTCHA ou esta é incorrecta.",
+ "recaptcha-create": "Para protexer o wiki contra a creación automática de páxinas, por favor, introduza as palabras que ve na caixa.",
+ "recaptcha-info": "Por favor, resolva o enigma ReCaptcha e devolva os valores de resposta en captchaId e captchaWord.",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "Campo do formulario ReCaptcha",
+ "recaptcha-apihelp-param-recaptcha_response_field": "Campo do formulario ReCaptcha",
+ "recaptcha-id-label": "Reto ReCaptcha",
+ "recaptcha-id-help": "Valor do reto ReCaptcha",
+ "recaptcha-label": "Solución do ReCaptcha",
+ "recaptcha-help": "Valor da solución ReCaptcha"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/gsw.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/gsw.json
new file mode 100644
index 00000000..6407d0f7
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/gsw.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Als-Holder"
+ ]
+ },
+ "recaptcha-edit": "Zum Schutz vor automatisiertem Spam, gib bitte di beide Werter in s Fäld unten yy:",
+ "recaptcha-addurl": "In Dyre Bearbeitg het s neji extärni Links. Zum Schutz vor automatisiertem Spam, gib bitte di beide Werter in s Fäld unten yy:",
+ "recaptcha-badlogin": "Zum Schutz gege automatisiert Knacken vu Passwerter, gib bitte di beide Werter in s Fäld unten yy:",
+ "recaptcha-createaccount": "Zum Schutz gege s automatisiert Aalege vu Benutzerkonte, gib bitte di beide Werter in s Fäld unten yy:",
+ "recaptcha-createaccount-fail": "D reCAPTCHA-Antwort isch fählerhaft oder si fählt.",
+ "recaptcha-create": "Zum Schutz gege s automatisiert Aalege vu Syte, gib bitte di beide Werter in s Fäld unten yy:"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/he.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/he.json
new file mode 100644
index 00000000..7c99d3e9
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/he.json
@@ -0,0 +1,15 @@
+{
+ "@metadata": {
+ "authors": [
+ "Yona b",
+ "Guycn2",
+ "Or"
+ ]
+ },
+ "recaptcha-edit": "כדי להגן על האתר מפני ספאם אוטומטי, אנא הקלידו את המילים שמופיעות בתיבה.",
+ "recaptcha-addurl": "העריכה כוללת קישורים חיצוניים חדשים. כהגנה מפני ספאם אוטומטי, אנא הקלידו את שתי המילים שמופיעות בתיבה.",
+ "recaptcha-badlogin": "כהגנה מפני מפצחי סיסמאות אוטומטיים, אנא הקלידו את שתי המילים בתיבה.",
+ "recaptcha-createaccount": "כהגנה מפני יצירת חשבונות אוטומטית, אנא הקלידו את המילים שמופיעות בתיבה.",
+ "recaptcha-createaccount-fail": "לא הוקלדו מילות האישור, או שהוקלדו מילים לא נכונות. נסו שנית.",
+ "recaptcha-create": "כדי להגן על האתר מפני יצירת דפים אוטומטית, אנא הקלידו את המילים שמופיעות בתיבה."
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/hsb.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/hsb.json
new file mode 100644
index 00000000..c37e61f2
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/hsb.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Michawiki"
+ ]
+ },
+ "recaptcha-edit": "Zo by wiki přećiwo awtomatizowanemu spamej škitał, zapisaj prošu dwě słowje, kotrejž w slědowacym polu widźiš:",
+ "recaptcha-addurl": "Twoja změna wobsahuje nowe eksterne wotkazy. Zo by wiki přećiwo awtomatizowanemu spamej škitał, zapisaj prošu dwě słowje, kotrejž w slědowacym polu widźiš:",
+ "recaptcha-badlogin": "Zo by wiki přećiwo awtomatizowanemu złamanju hesłow škitał, zapisaj prošu dwě słowje, kotrejž widźiš, do slědowaceho pola:",
+ "recaptcha-createaccount": "Zo by wiki přećiwo awtomatiskemu wutworjenju konta škitał, zapisaj prošu dwě słowje, kotrejž w slědowacym polu widźiš:",
+ "recaptcha-createaccount-fail": "Wopačna abo falowaca wotmołwa reCAPTCHA.",
+ "recaptcha-create": "Zo by wiki přećiwo awtomatiskemu wutworjenju strony škitał, zapisaj prošu dwě słowje, kotrejž w slědowacym polu widźiš:"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/hu.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/hu.json
new file mode 100644
index 00000000..2dedb777
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/hu.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Tacsipacsi"
+ ]
+ },
+ "recaptcha-edit": "Az automatizált spamek megelőzése miatt kérjük, hogy add meg a lenti keretben olvasható szavakat:",
+ "recaptcha-addurl": "A szerkesztésed új külső hivatkozásokat tartalmaz. Az automatizált spamek megelőzése miatt kérjük, hogy add meg a lenti keretben olvasható szavakat:",
+ "recaptcha-badlogin": "Hogy az automatizált jelszófeltörési kísérleteket megelőzzük, kérjük, hogy add meg a lenti keretben olvasható szavakat:",
+ "recaptcha-createaccount": "A felhasználói fiókok automatizált létrehozásának elkerülésére kérjük, írd be az alább megjelenő szavakat a szövegdobozba:",
+ "recaptcha-createaccount-fail": "Hibás vagy hiányzó reCAPTCHA-válasz.",
+ "recaptcha-create": "Az automatizált laplétrehozás megelőzése miatt kérjük, add meg a lenti keretben olvasható szavakat:",
+ "recaptcha-info": "Oldd meg a reCAPTCHA-feladatot, és küldd vissza a feladatot és a választ captchaId és captchaWord paraméterekként.",
+ "recaptcha-id-label": "ReCaptcha-feladat",
+ "recaptcha-label": "ReCaptcha-megoldás"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ia.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ia.json
new file mode 100644
index 00000000..513e458d
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ia.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "McDutchie"
+ ]
+ },
+ "recaptcha-edit": "Pro proteger le wiki contra le spam automatisate, per favor, scribe le parolas que tu vide in le quadro.",
+ "recaptcha-addurl": "Iste modification include nove ligamines externe. Pro proteger le wiki contra le spam automatisate, per favor, scribe le parolas que tu vide in le quadro.",
+ "recaptcha-badlogin": "Pro proteger le wiki contra le furto automatisate de contrasignos, per favor, scribe le parolas que tu vide in le quadro.",
+ "recaptcha-createaccount": "Pro proteger le wiki contra le creation automatisate de contos, per favor, scribe le parolas que tu vide in le quadro.",
+ "recaptcha-createaccount-fail": "Responsa reCAPTCHA incorrecte o mancante.",
+ "recaptcha-create": "Pro proteger le wiki contra le creation automatisate de paginas, per favor, scribe le parolas que tu vide in le quadro.",
+ "recaptcha-info": "Per favor, resolve le defia ReCaptcha e retorna in captchaId e captchaWord le valores del defia e del responsa.",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "Campo del formulario ReCaptcha",
+ "recaptcha-apihelp-param-recaptcha_response_field": "Campo del formulario ReCaptcha",
+ "recaptcha-id-label": "Defia ReCaptcha",
+ "recaptcha-id-help": "Valor del defia ReCaptcha",
+ "recaptcha-label": "Solution del ReCaptcha",
+ "recaptcha-help": "Valor del solution del ReCaptcha"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/id.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/id.json
new file mode 100644
index 00000000..45b3df2d
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/id.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "IvanLanin"
+ ]
+ },
+ "recaptcha-edit": "Untuk membantu pelindungan terhadap spam penyuntingan otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:",
+ "recaptcha-addurl": "Suntingan Anda menyertakan pranala eksternal baru. Untuk membantu pelindungan terhadap spam otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:",
+ "recaptcha-badlogin": "Untuk membantu pelindungan terhadap perengkahan sandi otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:",
+ "recaptcha-createaccount": "Untuk membantu pelindungan terhadap pembuatan akun otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:",
+ "recaptcha-createaccount-fail": "Jawaban reCAPTCHA tidak benar atau tidak dimasukkan.",
+ "recaptcha-create": "Untuk membantu pelindungan terhadap pembuatan halaman otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/it.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/it.json
new file mode 100644
index 00000000..d15d3a6b
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/it.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Beta16",
+ "Nemo bis",
+ "Selven"
+ ]
+ },
+ "recaptcha-edit": "Per proteggere il wiki dalle modifiche automatiche che aggiungono spam, ti chiediamo gentilmente di scrivere le parole mostrate nel riquadro.",
+ "recaptcha-addurl": "La tua modifica aggiunge qualche nuovo collegamento esterno. Per proteggere il wiki dallo spam automatico, ti chiediamo gentilmente di scrivere le parole mostrate nel riquadro.",
+ "recaptcha-badlogin": "Per proteggere il wiki dalla forzatura automatica delle password, ti chiediamo gentilmente di scrivere le parole mostrate nel riquadro.",
+ "recaptcha-createaccount": "Per proteggere il wiki dalla creazione automatica di nuove utenze, ti chiediamo gentilmente di scrivere le parole mostrate nel riquadro.",
+ "recaptcha-createaccount-fail": "Risposta reCAPTCHA mancante o errata.",
+ "recaptcha-create": "Per proteggere il wiki dalla creazione automatica di pagine, ti chiediamo gentilmente di scrivere le parole mostrate nel riquadro.",
+ "recaptcha-info": "Si prega di risolvere una sfida ReCaptcha e di riportare, i valori di sfida e risposta come captchaId e captchaWord.",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "Campo dal widget ReCaptcha",
+ "recaptcha-apihelp-param-recaptcha_response_field": "Campo dal widget ReCaptcha",
+ "recaptcha-id-label": "Sfida ReCaptcha",
+ "recaptcha-id-help": "Valore sfida ReCaptcha",
+ "recaptcha-label": "Soluzione ReCaptcha",
+ "recaptcha-help": "Valore soluzione ReCaptcha"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ja.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ja.json
new file mode 100644
index 00000000..62a3a22f
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ja.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Shirayuki",
+ "Otokoume",
+ "ネイ",
+ "Yusuke1109"
+ ]
+ },
+ "recaptcha-desc": "Confirm Edit 用 reCAPTCHA モジュール",
+ "recaptcha-edit": "ウィキへの自動編集スパム攻撃を防ぐため、お手数をおかけしますが画像に表示されている単語を入力してください。",
+ "recaptcha-addurl": "あなたは新しい外部リンクを追加しようとしています。ウィキへの自動スパム攻撃を防ぐため、お手数をおかけしますが画像に表示されている単語を入力してください。",
+ "recaptcha-badlogin": "ウィキへの自動パスワードクラック攻撃を防ぐため、お手数をおかけしますが画像に表示されている単語を入力してください。",
+ "recaptcha-createaccount": "ウィキでのアカウント自動作成を防ぐため、お手数をおかけしますが画像に表示されている単語を入力してください。",
+ "recaptcha-createaccount-fail": "文字列が正しくない、または入力されていません。",
+ "recaptcha-create": "ウィキでのページの自動作成を防ぐため、お手数をおかけしますが画像に表示されている単語を入力してください。",
+ "recaptcha-info": "ReCaptchaチャレンジを解決し、チャレンジとレスポンスの値をcaptchaIdとcaptchaWordとして返してください。",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "ReCaptchaウィジェットのフィールド",
+ "recaptcha-apihelp-param-recaptcha_response_field": "ReCaptchaウィジェットのフィールド"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ko.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ko.json
new file mode 100644
index 00000000..50807cd1
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ko.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "Priviet",
+ "아라",
+ "Asdfqwer51",
+ "Ykhwong"
+ ]
+ },
+ "recaptcha-desc": "편집 확인에 대한 reCAPCHA 모듈",
+ "recaptcha-edit": "자동 편집 스팸을 방지하기 위해, 아래 상자에 보이는 낱말을 입력하세요:",
+ "recaptcha-addurl": "편집에 새로운 바깥 고리가 포함되어 있습니다. 자동 스팸으로부터 보호하기 위해, 아래 상자에 보이는 낱말을 입력하세요:",
+ "recaptcha-badlogin": "자동 비밀번호 크래킹을 방지하기 위해, 아래 상자에 보이는 낱말을 입력하세요:",
+ "recaptcha-createaccount": "자동 계정 생성을 방지하기 위해, 아래 상자에 보이는 낱말을 입력하세요:",
+ "recaptcha-createaccount-fail": "reCAPTCHA 답이 올바르지 않거나 없습니다.",
+ "recaptcha-create": "위키에서의 자동 문서 생성을 방지하기 위해 아래 상자에 보이는 낱말을 입력하세요:"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ksh.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ksh.json
new file mode 100644
index 00000000..8bb7cf94
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ksh.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Purodha"
+ ]
+ },
+ "recaptcha-edit": "Schrief di zwei Wööt en dä Kaste onge erin.\nDat sull jääje et automattesche Ändere un SPAM em Wiki schöze.",
+ "recaptcha-addurl": "Schrief di zwei Wööt en dä Kaste onge erin.\nDat sull jääje automattesch en et Wiki jebraate SPAM schöze, nohdämm en Dingem Beidraach {{PLURAL:$1|ene neue Lengk dren es|neue Lengks dren sin|kein neue Lengks dren sin}}.",
+ "recaptcha-badlogin": "Schrief di zwei Wööt en dä Kaste onge erin.\nDat sull jääje et automattesche Paßwoot Knacke em Wiki schöze.",
+ "recaptcha-createaccount": "Schrief di zwei Wööt en dä Kaste onge erin.\nDat sull jääje SPAM un automattesch aanjelaate Zohjäng nohm Wiki schöze.",
+ "recaptcha-createaccount-fail": "Dat wohr en verkehte udder jaa kei Antwoot op dat Kaptscha.",
+ "recaptcha-create": "Schrief di zwei Wööt en dä Kaste onge erin.\nDat sull jääje SPAM un automattesch aanjelaate Sigge em Wiki schöze."
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/lb.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/lb.json
new file mode 100644
index 00000000..905660a3
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/lb.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Robby"
+ ]
+ },
+ "recaptcha-edit": "Fir d'Wiki géint automatiséierte Spam ze schützen, froe mir Iech d'Wierder déi Dir gesitt an d'Këscht anzeginn.",
+ "recaptcha-addurl": "An Ärer Ännerung sinn nei extern Linken! Fir d'Wiki géint automatiséierte Spam ze schütze, froe mir Iech déi Wierder déi Dir gesitt an d'Këscht anzeginn.",
+ "recaptcha-badlogin": "Fir d'Wiki géint d'automatiséiert Hacke vu Passwierder ze schützen, froe mir Iech d'Wierder déi Dir gesitt an d'Këscht anzeginn.",
+ "recaptcha-createaccount": "Fir d'Wiki géint d'automatiséiert Uleeë vu Benotzerkonten ze schützen, froe mir Iech d'Wierder déi Dir gesitt an d'Këscht anzeginn.",
+ "recaptcha-createaccount-fail": "reCAPTCHA Äntwert feelt oder ass net korrekt.",
+ "recaptcha-create": "Fir d'Wiki géint d'automatiséiert Uleeë vu Säiten ze schützen, froe mir Iech d'Wierder déi Dir gesitt an d'Këscht anzeginn."
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/lij.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/lij.json
new file mode 100644
index 00000000..9ab77945
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/lij.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Giromin Cangiaxo"
+ ]
+ },
+ "recaptcha-edit": "Pe proteze a wiki da-e modiffiche de spam aotomatizou, te domandemmo gentilmente de scrive e paole che ti veddi inta casella sottostante:",
+ "recaptcha-addurl": "A to modiffica a l'azonze di noeuvi inganci esterni. Pe proteze a wiki da-o spam aotomatizou, te domandemmo gentilmente de scrive e paole che ti veddi inta casella sottostante:",
+ "recaptcha-badlogin": "Pe proteze a wiki da-a sforçatua aotomatizâ de password, te domandemmo gentilmente de scrive e paole che ti veddi inta casella sottostante:",
+ "recaptcha-createaccount": "Pe proteze a wiki da-a creaçion aotomatizâ de noeuve utençe, te domandemmo gentilmente de scrive e paole che ti veddi inta casella sottostante:",
+ "recaptcha-createaccount-fail": "Risposta reCAPTCHA mancante ò errâ.",
+ "recaptcha-create": "Pe proteze a wiki da-a creaçion aotomatizâ de paggine, te domandemmo gentilmente de scrive e paole che ti veddi inta casella sottostante:",
+ "recaptcha-info": "Se prega de resciorve una sfidda ReCaptcha e de riportâ, i valoî de sfidda e risposta comme captchaId e captchaWord.",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "Campo da-o widget ReCaptcha",
+ "recaptcha-apihelp-param-recaptcha_response_field": "Campo da-o widget ReCaptcha",
+ "recaptcha-id-label": "Sfidda ReCaptcha",
+ "recaptcha-id-help": "Valô sfidda ReCaptcha",
+ "recaptcha-label": "Soluçion ReCaptcha",
+ "recaptcha-help": "Valô soluçion ReCaptcha"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/lt.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/lt.json
new file mode 100644
index 00000000..25041cfd
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/lt.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Eitvys200"
+ ]
+ },
+ "recaptcha-edit": "Kad apsaugotume vikį nuo automatinio keitimų šlamšto, prašome įvesti žodžius, kurios matote laukelyje.",
+ "recaptcha-addurl": "Jūsų keitime yra naujų išorinių nuorodų. Kad apsaugotume vikį nuo automatinio keitimų šlamšto, prašome įvesti žodžius, kurios matote laukelyje.",
+ "recaptcha-badlogin": "Kad apsaugotume vikį nuo automatinio slaptažodžių spėjimo, prašome įvesti žodžius, kurios matote laukelyje.",
+ "recaptcha-createaccount": "Kad apsaugotume vikį nuo automatinio paskyrų kūrimo, prašome įvesti žodžius, kurios matote laukelyje.",
+ "recaptcha-createaccount-fail": "Neteisingas arba nenurodytas reCAPTCHA atsakymas.",
+ "recaptcha-create": "Kad apsaugotume vikį nuo automatinio puslapių kūrimo, prašome įvesti žodžius, kurios matote laukelyje.",
+ "recaptcha-info": "Prašome išspręsti ReCaptcha iššūkį ir gražinti iššūkio ir atsakymo reikšmes kaip captchaId ir captchaWord.",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "Laukas iš ReCaptcha valdiklio",
+ "recaptcha-apihelp-param-recaptcha_response_field": "Laukas iš ReCaptcha valdiklio",
+ "recaptcha-id-label": "ReCaptcha iššūkis",
+ "recaptcha-id-help": "ReCaptcha iššūkio reikšmė",
+ "recaptcha-label": "ReCaptcha sprendimas",
+ "recaptcha-help": "ReCaptcha sprendimo reikšmė"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/mk.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/mk.json
new file mode 100644
index 00000000..4f156659
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/mk.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Bjankuloski06"
+ ]
+ },
+ "recaptcha-desc": "Модул reCAPTCHA за потврда на уредувања",
+ "recaptcha-edit": "Како заштитна мерка против автоматизиран спам, би ве замолиле да ги внесете зборовите прикажани во полето:",
+ "recaptcha-addurl": "Во вашите измени има нови надворешни врски. Како заштитна мерка против автоматизиран спам, би ве замолиле да внесете зборовите прикажани во полето:",
+ "recaptcha-badlogin": "Како заштитна мерка против автоматизирано провалување на лозинки, би ве замолиле да внесете зборовите прикажани во полето:",
+ "recaptcha-createaccount": "Како заштитна мерка против автоматизирано создавање на сметки, би ве замолиле да внесете зборовите прикажани во полето:",
+ "recaptcha-createaccount-fail": "reCAPTCHA доби погрешен одговор или одговорот недостасува.",
+ "recaptcha-create": "Како заштитна мерка против автоматизирано создавање на страници, би ве замолиле да внесете зборовите прикажани во полето:",
+ "recaptcha-info": "Решете го предизвикот ReCaptcha и вратете ги вредностите на предизвикот и одговорот како captchaId и captchaWord.",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "Поле од поср. елемент ReCaptcha",
+ "recaptcha-apihelp-param-recaptcha_response_field": "Поле од поср. елемент ReCaptcha",
+ "recaptcha-id-label": "ReCaptcha-предизвик",
+ "recaptcha-id-help": "Вредност од ReCaptcha-предизвикот",
+ "recaptcha-label": "Решение од ReCaptcha",
+ "recaptcha-help": "Вредност на решението од ReCaptcha"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ms.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ms.json
new file mode 100644
index 00000000..5d43a353
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ms.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Anakmalaysia"
+ ]
+ },
+ "recaptcha-edit": "Untuk membanteras kegiatan spam automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:",
+ "recaptcha-addurl": "Suntingan anda termasuk pautan luar baru. Untuk membanteras kegiatan spam automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:",
+ "recaptcha-badlogin": "Untuk membanteras kegiatan meneka kata laluan secara automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:",
+ "recaptcha-createaccount": "Untuk membanteras kegiatan membuka akaun secara automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:",
+ "recaptcha-createaccount-fail": "Jawapan reCAPTCHA tidak betul atau tidak ada.",
+ "recaptcha-create": "Untuk membanteras kegiatan mencipta laman secara automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/mt.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/mt.json
new file mode 100644
index 00000000..fd799424
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/mt.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Chrisportelli"
+ ]
+ },
+ "recaptcha-edit": "Sabiex tgħinna nipproteġu kontra l-modifiki li jżidu spam, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:",
+ "recaptcha-addurl": "Il-modifika tiegħek tinkludi ħoloq esterni ġodda. Sabiex tipproteġi kontra spam awtomatiku, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:",
+ "recaptcha-badlogin": "Sabiex tgħinna nipproteġu kontra l-infurzar awtomatiku tal-passwords, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:",
+ "recaptcha-createaccount": "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' kontijiet ġodda, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:",
+ "recaptcha-createaccount-fail": "Tweġiba reCAPTCHA ħażina jew nieqsa.",
+ "recaptcha-create": "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' paġni, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/nb.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/nb.json
new file mode 100644
index 00000000..7cc7da16
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/nb.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Event"
+ ]
+ },
+ "recaptcha-edit": "Som beskyttelse mot automatisk redigert spam, vennligst skriv inn de to ordene du ser i boksen under:",
+ "recaptcha-addurl": "Din redigering inneholder nye eksterne lenker. Som beskyttelse mot automatisk spam, vennligst skriv inn de to ordene du ser i boksen under:",
+ "recaptcha-badlogin": "Som beskyttelse mot automatisk passordknekking, vennligst skriv inn de to ordene du ser i boksen under:",
+ "recaptcha-createaccount": "Som beskyttelse mot automatisk opprettelse av brukerkonto, vennligst skriv inn de to ordene du ser i boksen under:",
+ "recaptcha-createaccount-fail": "Feil eller manglende reCAPTCHA-svar.",
+ "recaptcha-create": "Som beskyttelse mot automatisk opprettelse av side, vennligst skriv inn de to ordene du ser i boksen under:"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/nl-informal.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/nl-informal.json
new file mode 100644
index 00000000..f321d6a0
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/nl-informal.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "Siebrand"
+ ]
+ },
+ "recaptcha-edit": "Voer ter bescherming tegen geautomatiseerde spam de twee woorden die je ziet in het invoervenster in:",
+ "recaptcha-addurl": "Je bewerking bevat nieuwe externe koppelingen. Voer ter bescherming tegen geautomatiseerde spam de twee woorden die je ziet in het invoervenster in:",
+ "recaptcha-badlogin": "Voer ter bescherming tegen het automatisch kraken van wachtwoorden de twee woorden die je ziet in het invoervenster in:",
+ "recaptcha-createaccount": "Om het automatisch aanmaken van gebruikers tegen te gaan moet je de twee woorden die je ziet invoeren:",
+ "recaptcha-create": "Om het automatisch aanmaken van pagina's tegen te gaan moet je de twee woorden die je ziet invoeren:"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/nl.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/nl.json
new file mode 100644
index 00000000..a108f255
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/nl.json
@@ -0,0 +1,14 @@
+{
+ "@metadata": {
+ "authors": [
+ "HanV",
+ "Siebrand"
+ ]
+ },
+ "recaptcha-edit": "Voer ter bescherming tegen geautomatiseerde spam de twee woorden in die u in het onderstaande venster ziet:",
+ "recaptcha-addurl": "Uw bewerking bevat nieuwe externe koppelingen. Voer ter bescherming tegen geautomatiseerde spam de twee woorden in die u ziet in het onderstaande venster:",
+ "recaptcha-badlogin": "Voer ter bescherming tegen het automatisch kraken van wachtwoorden de twee woorden in die u ziet in het invoervenster:",
+ "recaptcha-createaccount": "Om het automatisch aanmaken van gebruikers tegen te gaan moet u de twee woorden in het onderstaande venster invoeren:",
+ "recaptcha-createaccount-fail": "Het reCAPTCHA-antwoord is onjuist of niet ingevoerd.",
+ "recaptcha-create": "Om het automatisch aanmaken van een pagina tegen te gaan moet u de twee woorden invoeren die in het onderstaande veld staan:"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/oc.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/oc.json
new file mode 100644
index 00000000..657f9f90
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/oc.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Cedric31"
+ ]
+ },
+ "recaptcha-createaccount-fail": "Responsa de reCAPTCHA faussa o mancanta."
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/pl.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/pl.json
new file mode 100644
index 00000000..9db5f28b
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/pl.json
@@ -0,0 +1,15 @@
+{
+ "@metadata": {
+ "authors": [
+ "WTM",
+ "Chrumps",
+ "Tsca"
+ ]
+ },
+ "recaptcha-edit": "W celu ochrony przed zautomatyzowanym spamem, proszę wpisać słowa widoczne w odpowiednim polu.",
+ "recaptcha-addurl": "Wprowadzony przez Ciebie tekst zawiera nowe linki zewnętrzne. W celu ochrony przed zautomatyzowanym spamem, proszę wpisać słowa widoczne w odpowiednim polu.",
+ "recaptcha-badlogin": "W celu ochrony przed zautomatyzowanym łamaniem haseł, proszę wpisać słowa widoczne w odpowiednim polu.",
+ "recaptcha-createaccount": "W celu ochrony przed zautomatyzowanym tworzeniem kont, proszę wpisać słowa widoczne w odpowiednim polu.",
+ "recaptcha-createaccount-fail": "Odpowiedź na reCAPTCHA jest fałszywa lub brakująca.",
+ "recaptcha-create": "W celu ochrony przed przed automatycznym tworzeniem stron, proszę wpisać słowa widoczne w odpowiednim polu."
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/pms.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/pms.json
new file mode 100644
index 00000000..7f25a5f3
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/pms.json
@@ -0,0 +1,14 @@
+{
+ "@metadata": {
+ "authors": [
+ "Borichèt",
+ "Dragonòt"
+ ]
+ },
+ "recaptcha-edit": "Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël quàder sì-sota:",
+ "recaptcha-addurl": "Soa modìfica a conten d'anliure esterne neuv. Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël quàder sì-sota:",
+ "recaptcha-badlogin": "Për giuté a protege contra la forsadura automatisà ëd le ciav, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël formolari sì-sota:",
+ "recaptcha-createaccount": "Për giuté a protege contra la creassion automatisà ëd cont, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël formolari sì-sota:",
+ "recaptcha-createaccount-fail": "Rispòsta ëd reCAPTCHA fàussa o mancanta.",
+ "recaptcha-create": "Për giuté a protege contra la creassion automatisà ëd pàgine, për piasì ch'a scriv le doe paròle ch'a s-ciàira ant la casela sì-sota:"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/pt-br.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/pt-br.json
new file mode 100644
index 00000000..10d0071e
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/pt-br.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Felipe L. Ewald"
+ ]
+ },
+ "recaptcha-edit": "Para proteger a wiki contra edições automatizadas de spam, nós gentilmente pedimos que digite as palavras que você vê na caixa.",
+ "recaptcha-addurl": "A sua edição inclui ligações externas. Para proteger a wiki contra edições automatizadas de spam, nós gentilmente pedimos que digite as palavras que você vê na caixa.",
+ "recaptcha-badlogin": "Para proteger a wiki contra a quebra de senha automatizada, nós gentilmente pedimos que digite as palavras que você vê na caixa abaixo.",
+ "recaptcha-createaccount": "Para proteger a wiki contra criação automatizada de usuários, nós gentilmente pedimos que digite as palavras que você vê na caixa.",
+ "recaptcha-createaccount-fail": "Resposta incorreta ao reCAPTCHA.",
+ "recaptcha-create": "Para proteger a wiki contra criação automatizada de páginas, nós gentilmente pedimos que digite as palavras que você vê na caixa.",
+ "recaptcha-info": "Por favor, resolva um desafio do ReCaptcha e retorne os valores do desafio e da resposta como captchaId e captchaWord.",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "Campo do widget ReCaptcha",
+ "recaptcha-apihelp-param-recaptcha_response_field": "Campo do widget ReCaptcha",
+ "recaptcha-id-label": "Desafio do ReCaptcha",
+ "recaptcha-id-help": "Valor de desafio ReCaptcha",
+ "recaptcha-label": "Solução ReCaptcha",
+ "recaptcha-help": "Valor da solução ReCaptcha"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/pt.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/pt.json
new file mode 100644
index 00000000..13096ff1
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/pt.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hamilton Abreu",
+ "Fúlvio",
+ "Vitorvicentevalente"
+ ]
+ },
+ "recaptcha-edit": "Para proteger esta wiki contra <i>spam</i> automatizado, solicitamos que introduza as palavras que vê na caixa.",
+ "recaptcha-addurl": "A sua edição contém ligações externas novas. Para proteger a wiki contra <i>spam</i> automatizado, introduza as palavras que vê na caixa.",
+ "recaptcha-badlogin": "Para proteger esta wiki contra mecanismos automatizados de descoberta de palavras-passe, por favor introduza as palavras que vê na caixa.",
+ "recaptcha-createaccount": "Para proteger esta wiki contra a criação de contas automatizada, solicitamos que introduza as palavras que vê na caixa.",
+ "recaptcha-createaccount-fail": "A resposta ao reCAPTCHA está vazia ou errada.",
+ "recaptcha-create": "Para proteger esta wiki contra a criação de páginas automatizada, solicitamos que introduza as palavras que vê na caixa.",
+ "recaptcha-info": "Resolva o desafio do ReCaptcha e devolva os valores do desafio e da resposta como captchaId e captchaWord.",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "Campo do <i>widget</i> ReCaptcha",
+ "recaptcha-apihelp-param-recaptcha_response_field": "Campo do <i>widget</i> ReCaptcha",
+ "recaptcha-id-label": "Desafio do ReCaptcha",
+ "recaptcha-id-help": "Valor do desafio do ReCaptcha",
+ "recaptcha-label": "Solução do ReCaptcha",
+ "recaptcha-help": "Valor da solução do ReCaptcha"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/qqq.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/qqq.json
new file mode 100644
index 00000000..461a42b5
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/qqq.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Raymond",
+ "Shirayuki",
+ "Umherirrender"
+ ]
+ },
+ "recaptcha-desc": "{{Optional}}\n{{desc}}",
+ "recaptcha-edit": "{{Related|ConfirmEdit-edit}}",
+ "recaptcha-addurl": "{{Related|ConfirmEdit-addurl}}",
+ "recaptcha-badlogin": "{{Related|ConfirmEdit-badlogin}}",
+ "recaptcha-createaccount": "{{Related|ConfirmEdit-createaccount}}",
+ "recaptcha-createaccount-fail": "{{Related|ConfirmEdit-createaccount-fail}}",
+ "recaptcha-create": "{{Related|ConfirmEdit-create}}",
+ "recaptcha-info": "Explanation of how to solve the CAPTCHA for API clients.",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "{{doc-apihelp-param|description=the \"recaptcha_challenge_field\" parameter added by [[mw:Extension:ConfirmEdit]]|noseealso=1}}\nSee also {{msg-mw|recaptcha-apihelp-param-recaptcha_response_field}}",
+ "recaptcha-apihelp-param-recaptcha_response_field": "{{doc-apihelp-param|description=the \"recaptcha_response_field\" parameter added by [[mw:Extension:ConfirmEdit]]|noseealso=1}}\nSee also {{msg-mw|recaptcha-apihelp-param-recaptcha_challenge_field}}",
+ "recaptcha-id-label": "API CAPTCHA challenge ID field label.",
+ "recaptcha-id-help": "API CAPTCHA challenge ID field help.",
+ "recaptcha-label": "API CAPTCHA solution ID field label.",
+ "recaptcha-help": "API CAPTCHA solution ID field help."
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/roa-tara.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/roa-tara.json
new file mode 100644
index 00000000..cba54574
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/roa-tara.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Joetaras"
+ ]
+ },
+ "recaptcha-edit": "Pe proteggere sta uicchi condre le cangiaminde automatece de le rummate, pe piacere scrive le parole ca 'ndruche jndr'à buatte aqquà sotte:",
+ "recaptcha-addurl": "Le cangiaminde tune ténene collegaminde de fore nuève. Pe proteggere condre le cangiaminde automatece de le rummate, pe piacere scrive le parole ca 'ndruche jndr'à buatte aqquà sotte:",
+ "recaptcha-badlogin": "Pe proteggere condre le futteminde automatece de le passuord, pe piacere scrive le parole ca 'ndruche jndr'à buatte aqquà sotte:",
+ "recaptcha-createaccount": "Pe proteggere condre le ccrejaziune automatece de le cunde, pe piacere scrive le parole ca 'ndruche jndr'à buatte aqquà sotte:",
+ "recaptcha-createaccount-fail": "Resposte reCAPTCHA ingorrette o mangande.",
+ "recaptcha-create": "Pe proteggere condre le ccrejaziune automatece de le pàggene, pe piacere scrive le parole ca 'ndruche jndr'à buatte aqquà sotte:",
+ "recaptcha-info": "Pe piacere resolve 'na sfide ReCaptcha e mitte, le valore d'a sfide e resposte cumme captchaId e captchaWord.",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "Cambe d'u uigget ReCaptcha",
+ "recaptcha-apihelp-param-recaptcha_response_field": "Cambe da 'u uigget ReCaptcha",
+ "recaptcha-id-label": "Sfide ReCaptcha",
+ "recaptcha-id-help": "Valore d'a sfide ReCaptcha",
+ "recaptcha-label": "Soluzione ReCaptcha",
+ "recaptcha-help": "Valore d'a soluzione ReCaptcha"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ru.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ru.json
new file mode 100644
index 00000000..d1be0ec5
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/ru.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Okras",
+ "Александр Сигачёв",
+ "Metastasis",
+ "Irus",
+ "Facenapalm"
+ ]
+ },
+ "recaptcha-edit": "В целях защиты от автоматического спама в правках просим вас ввести слова, которые вы видите ниже.",
+ "recaptcha-addurl": "Ваша правка содержит новые внешние ссылки. В целях защиты от автоматического спама просим вас ввести слова, которые вы видите в рамке ниже.",
+ "recaptcha-badlogin": "В целях защиты от автоматического подбора пароля просим вас ввести слова, которые вы видите в рамке ниже.",
+ "recaptcha-createaccount": "В целях защиты от автоматического создания учётных записей просим вас ввести слова, которые вы видите в рамке ниже.",
+ "recaptcha-createaccount-fail": "Ответ reCAPTCHA неправильный или отсутствует.",
+ "recaptcha-create": "В целях защиты от автоматического создания страниц просим вас ввести слова, которые вы видите в рамке ниже.",
+ "recaptcha-info": "Пожалуйста, решите задачу ReCaptcha и верните значения задачи и ответа как captchaId и captchaWord.",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "Поле в виджете ReCaptcha",
+ "recaptcha-apihelp-param-recaptcha_response_field": "Поле в виджете ReCaptcha",
+ "recaptcha-id-label": "Задача ReCaptcha",
+ "recaptcha-id-help": "Значение задачи ReCaptcha",
+ "recaptcha-label": "Решение ReCaptcha",
+ "recaptcha-help": "Значение решения ReCaptcha"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/si.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/si.json
new file mode 100644
index 00000000..c6ab0ee2
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/si.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "පසිඳු කාවින්ද"
+ ]
+ },
+ "recaptcha-createaccount-fail": "වැරදි හෝ දක්නට නොමැති reCAPTCHA පිළිතුර."
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/sr-ec.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/sr-ec.json
new file mode 100644
index 00000000..d3cb0c90
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/sr-ec.json
@@ -0,0 +1,15 @@
+{
+ "@metadata": {
+ "authors": [
+ "Rancher",
+ "Milicevic01",
+ "Сербијана"
+ ]
+ },
+ "recaptcha-desc": "Модул reCAPTCHA за потврду уређивања",
+ "recaptcha-edit": "Да би заштитили вики од аутоматског спамовања, љубазно Вас молимо да упишете речи које видите у кутији.",
+ "recaptcha-addurl": "Ваша измена садржи нове спољашње везе. У циљу заштите викија од аутоматизованог спамовања, љубазно Вас молимо да упишете речи које видите у кутији.",
+ "recaptcha-badlogin": "Да би заштитили викију од аутоматизованог пробијања лозинки, љубазно Вас молимо да упишете речи које видите у кутији.",
+ "recaptcha-createaccount": "Да би заштитили викију од аутоматизованог отварања налога, љубазно Вас молимо да упишете речи које видите у кутији.",
+ "recaptcha-create": "Да би заштитили викију од аутоматизованог прављења страница, љубазно Вас молимо да упишете речи које видите у кутији."
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/sr-el.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/sr-el.json
new file mode 100644
index 00000000..a14e4d4f
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/sr-el.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Milicevic01"
+ ]
+ },
+ "recaptcha-desc": "Modul reCAPTCHA za potvrdu uređivanja",
+ "recaptcha-edit": "Da bi onemogućili automatizovano spamovanje, ljubazno Vas molimo da upišete dve reči koje vidite u kutijicu ispod:",
+ "recaptcha-addurl": "Vaša izmena sadrži nove spoljašnje veze. U cilju zaštite od automatizovanog spamovanja, ljubazno Vas molimo da upišete dve reči koje vidite u kutijicu ispod:",
+ "recaptcha-badlogin": "Da bi onemogućili automatizovano probijanje lozinki, ljubazno Vas molimo da upišete dve reči koje vidite u kutijicu ispod:",
+ "recaptcha-createaccount": "Da bi onemogućili automatizovano otvaranje naloga, ljubazno Vas molimo da upišete dve reči koje vidite u kutijicu ispod:",
+ "recaptcha-create": "Da bi onemogućili automatizovano pravljenje stranica, ljubazno Vas molimo da upišete dve reči koje vidite u kutijicu ispod:"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/sv.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/sv.json
new file mode 100644
index 00000000..5663abb7
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/sv.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "WikiPhoenix"
+ ]
+ },
+ "recaptcha-edit": "För att skydda wikin mot automatiskt redigeringsspam ber vi dig att skriva orden du ser i rutan.",
+ "recaptcha-addurl": "Din redigering innehåller nya externa länkar. För att skydda wikin mot automatiserat spam ber vi dig att skriva orden du ser i rutan.",
+ "recaptcha-badlogin": "För att skydda wikin mot automatiserade försök att knäcka lösenord ber vi dig att skriva in orden du ser i rutan.",
+ "recaptcha-createaccount": "För att skydda wikin mot automatiskt kontoskapande ber vi dig att skriva orden som du ser i rutan.",
+ "recaptcha-createaccount-fail": "Du har angivit ett felaktig svar för reCAPTCHA.",
+ "recaptcha-create": "För att skydda wikin mot att sidor skapas automatiskt ber vi dig att skriva in de två orden du ser i rutan.",
+ "recaptcha-info": "Lös en ReCaptcha-utmaning och returnera utmanings- och svarsvärdet som captchaId och captchaWord.",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "Fält från ReCaptcha-widgeten",
+ "recaptcha-apihelp-param-recaptcha_response_field": "Fält från ReCaptcha-widgeten",
+ "recaptcha-id-label": "ReCaptcha-utmaning",
+ "recaptcha-id-help": "ReCaptcha-utmaningsvärde",
+ "recaptcha-label": "ReCaptcha-lösning",
+ "recaptcha-help": "ReCaptcha-lösningsvärde"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/sw.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/sw.json
new file mode 100644
index 00000000..245de04c
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/sw.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Lloffiwr"
+ ]
+ },
+ "recaptcha-edit": "Ili kusaidia kuzuia mashine zisihariri, tafadhali andika maneno mawili yanayoonekana katika kisanduku pakipo chini:",
+ "recaptcha-addurl": "Haririo lako lina viungo vipya vya nje. Ili kusaidia katika kuzuisha viungo visivyotakiwa visiwekwe na mashine, tafadhali andika maneno mawili yanayoonekana katika kisanduku pakipo chini:",
+ "recaptcha-badlogin": "Ili kusaidia katika kuzuia neno lako la siri lisigunduliwe na mashine, tafadhali andika maneno mawili yanayoonekana katika kisanduku pakipo chini:",
+ "recaptcha-createaccount": "Ili kusaidia kuzuia akaunti zisifunguliwe nyingi na mashine, tafadhali andika maneno mawili yanayoonekana katika kisanduku pakipo chini:",
+ "recaptcha-createaccount-fail": "Jibu la swali la CAPTCHA si sahihi au halipo.",
+ "recaptcha-create": "Ili kusaidia kuzuia kurasa zisianzishwe nyingi na mashine, tafadhali andika maneno mawili yanayoonekana katika kisanduku pakipo chini:"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/te.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/te.json
new file mode 100644
index 00000000..9b994825
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/te.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ravichandra"
+ ]
+ },
+ "recaptcha-edit": "వికీలో యాంత్రికంగా మార్పులు చేసే స్పామర్లను నియంత్రించడానికి కింద పెట్టెలో ఉన్న రెండు పదాలను టైపు చెయ్యండి:",
+ "recaptcha-addurl": "మీ మార్పులు కొత్త బాహ్య లింకులు కలిగి ఉన్నాయి. వికీలో యాంత్రికంగా మార్పులు చేసే స్పామర్లను నియంత్రించడానికి కింద పెట్టెలో ఉన్న రెండు పదాలను టైపు చెయ్యండి:",
+ "recaptcha-badlogin": "వికీలో పాస్‌వర్డ్ దొంగిలించే స్పామర్లను నియంత్రించడానికి కింద పెట్టెలో ఉన్న రెండు పదాలను టైపు చెయ్యండి:",
+ "recaptcha-createaccount": "వికీలో యాంత్రికంగా ఖాతా సృష్టించేవారిని నియంత్రించడానికి కింద పెట్టెలో ఉన్న రెండు పదాలను టైపు చెయ్యండి:",
+ "recaptcha-createaccount-fail": "reCAPTCHA సమాధానం తప్పుగా ఇచ్చారు లేదా అసలే ఇవ్వలేదు.",
+ "recaptcha-create": "వికీలో యాంత్రికంగా పేజీ సృష్టించేవారిని నియంత్రించడానికి కింద పెట్టెలో ఉన్న రెండు పదాలను టైపు చెయ్యండి:"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/tl.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/tl.json
new file mode 100644
index 00000000..6b843b72
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/tl.json
@@ -0,0 +1,14 @@
+{
+ "@metadata": {
+ "authors": [
+ "AnakngAraw"
+ ]
+ },
+ "recaptcha-desc": "Modulo ng reCAPTCHA para sa Pagtiyak ng Pagbago",
+ "recaptcha-edit": "Upang makatulong sa pagprutekta laban sa kusang basurang pamamatnugot, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:",
+ "recaptcha-addurl": "Ang pagbabago mo ay nagsasama ng bagong panlabas na mga kawing. Upang makatulong sa pagprutekta laban sa kusang paglusob ng basurang-liham, paki imakinilya ang dalawang mga salitang nakikita sa loob ng kahong nasa ibaba:",
+ "recaptcha-badlogin": "Upang makatulong sa pagsasanggalang laban sa kusang panghuhula ng hudyat, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:",
+ "recaptcha-createaccount": "Upang makatulong sa pagprutekta laban sa kusang paglikha ng akawnt, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:",
+ "recaptcha-createaccount-fail": "Hindi tama o nawawalang sagot sa reCAPTCHA.",
+ "recaptcha-create": "Upang makatulong sa pagprutekta laban sa kusang paglikha ng pahina, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/uk.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/uk.json
new file mode 100644
index 00000000..13cc233e
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/uk.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Andriykopanytsia",
+ "Base",
+ "Тест",
+ "Piramidion",
+ "Ата"
+ ]
+ },
+ "recaptcha-edit": "Для запобігання автоматичному спаму у редагуваннях просимо Вас ввести слова, які Ви бачите у поданому блоці.",
+ "recaptcha-addurl": "Ваше редагування містить зовнішні посилання. Для запобігання автоматичному спаму у редагуваннях просимо Вас ввести слова, які Ви бачите у блоці поданому блоці.",
+ "recaptcha-badlogin": "Для запобігання автоматичному підбору паролю просимо Вас ввести слова, які Ви бачите у поданому блоці.",
+ "recaptcha-createaccount": "Для запобігання автоматичному створенню облікових записів просимо Вас ввести слова, які Ви бачите у поданому блоці.",
+ "recaptcha-createaccount-fail": "Відповідь reCAPTCHA неправильна або відсутня.",
+ "recaptcha-create": "З метою захисту вікі від автоматичного створення сторінки просимо Вас ввести слова, які Ви бачите у блоці поданому блоці.",
+ "recaptcha-info": "Будь ласка, вирішіть завдання ReCaptcha і введіть значення завдання та відповіді як captchaId та captchaWord.",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "Поле із віджета ReCaptcha",
+ "recaptcha-apihelp-param-recaptcha_response_field": "Поле із віджета ReCaptcha",
+ "recaptcha-id-label": "Завдання ReCaptcha",
+ "recaptcha-id-help": "Значення завдання ReCaptcha",
+ "recaptcha-label": "Відповідь ReCaptcha",
+ "recaptcha-help": "Значення відповіді ReCaptcha"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/vi.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/vi.json
new file mode 100644
index 00000000..a8888c40
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/vi.json
@@ -0,0 +1,14 @@
+{
+ "@metadata": {
+ "authors": [
+ "Minh Nguyen"
+ ]
+ },
+ "recaptcha-desc": "Mô đun reCAPTCHA cho Confirm Edit",
+ "recaptcha-edit": "Để giúp tránh các sửa đổi spam tự động, xin vui lòng gõ hai từ mà bạn nhìn thấy vào hộp dưới đây:",
+ "recaptcha-addurl": "Sửa đổi của bạn có chứa liên kết ngoài mới. Để giúp tránh các sửa đổi spam tự động, xin vui lòng gõ hai từ mà bạn nhìn vào hộp dưới đây:",
+ "recaptcha-badlogin": "Để giúp tránh bẻ khóa mật khẩu tự động, xin vui lòng gõ hai từ mà bạn nhìn vào hộp dưới đây:",
+ "recaptcha-createaccount": "Để giúp tránh việc mở tài khoản tự động, xin vui lòng gõ hai từ mà bạn nhìn vào hộp dưới đây:",
+ "recaptcha-createaccount-fail": "Thiếu câu trả lời reCAPTCHA hoặc câu trả lời không đúng.",
+ "recaptcha-create": "Để giúp tránh việc tạo trang tự động, xin vui lòng gõ hai từ mà bạn nhìn vào hộp dưới đây:"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/zh-hans.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/zh-hans.json
new file mode 100644
index 00000000..b5e074d2
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/zh-hans.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hydra",
+ "Hzy980512",
+ "Onecountry",
+ "Liuxinyu970226"
+ ]
+ },
+ "recaptcha-desc": "用于确认编辑的reCAPTCHA模块",
+ "recaptcha-edit": "为了避免垃圾用户自动编辑,我们恳请您输入在框中看到的字词。",
+ "recaptcha-addurl": "您的编辑包含新的外部链接。为了避免垃圾用户自动编辑,我们恳请您输入框中看到的字词。",
+ "recaptcha-badlogin": "为避免自动密码破解,我们恳请您输入框中看到的字词。",
+ "recaptcha-createaccount": "为了避免创建自动垃圾用户,我们恳请您输入在框中看到的字词。",
+ "recaptcha-createaccount-fail": "reCAPTCHA 答案不正确或未填写。",
+ "recaptcha-create": "为了避免垃圾用户自动创建页面,我们恳请您输入在框中看到的字词。",
+ "recaptcha-info": "请解决ReCaptcha挑战,返回挑战并将值作为验证码ID和验证码文字回应。",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "来自ReCaptcha小部件的字段",
+ "recaptcha-apihelp-param-recaptcha_response_field": "来自ReCaptcha小部件的字段",
+ "recaptcha-id-label": "ReCaptcha挑战",
+ "recaptcha-id-help": "ReCaptcha挑战值",
+ "recaptcha-label": "ReCaptcha解决",
+ "recaptcha-help": "ReCaptcha解决值"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/zh-hant.json b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/zh-hant.json
new file mode 100644
index 00000000..ee21e120
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/i18n/zh-hant.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "StephDC",
+ "Cwlin0416",
+ "Suchichi02",
+ "Liuxinyu970226",
+ "Kly"
+ ]
+ },
+ "recaptcha-edit": "為保護 wiki 防止自動化垃圾內容編輯程式,我們要麻煩您輸入在方塊中顯示的單字。",
+ "recaptcha-addurl": "您的編輯使用了新的外部連結。為了防止自動化垃圾內容編輯程式,我們要麻煩您輸入在方塊中顯示的單字。",
+ "recaptcha-badlogin": "為保護 wiki 防止密碼破解程式,我們要麻煩您輸入在方塊中顯示的單字。",
+ "recaptcha-createaccount": "為保護 wiki 防止自動註冊程式,我們要麻煩您輸入在方塊中顯示的單字。",
+ "recaptcha-createaccount-fail": "不正確或者未輸入 reCAPTCHA 答案。",
+ "recaptcha-create": "為了防止自動建立頁面程式,我們要麻煩您輸入在方塊中顯示的單字。",
+ "recaptcha-info": "請解決 ReCaptcha 的盤問,並回傳作為驗證碼 ID、驗證碼文字的盤問值與回應值。",
+ "recaptcha-apihelp-param-recaptcha_challenge_field": "自 ReCaptcha 小工具的欄位",
+ "recaptcha-apihelp-param-recaptcha_response_field": "自 ReCaptcha 小工具的欄位",
+ "recaptcha-id-label": "ReCaptcha 盤問",
+ "recaptcha-id-help": "ReCaptcha 盤問值",
+ "recaptcha-label": "ReCaptcha 處理",
+ "recaptcha-help": "ReCaptcha 處理值"
+}
diff --git a/www/wiki/extensions/ConfirmEdit/ReCaptcha/recaptchalib.php b/www/wiki/extensions/ConfirmEdit/ReCaptcha/recaptchalib.php
new file mode 100644
index 00000000..e5636ddd
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/ReCaptcha/recaptchalib.php
@@ -0,0 +1,274 @@
+<?php
+/**
+ * This is a PHP library that handles calling reCAPTCHA.
+ * - Documentation and latest version
+ * http://recaptcha.net/plugins/php/
+ * - Get a reCAPTCHA API Key
+ * https://www.google.com/recaptcha/admin/create
+ * - Discussion group
+ * http://groups.google.com/group/recaptcha
+ *
+ * Copyright (c) 2007 reCAPTCHA -- http://recaptcha.net
+ * AUTHORS:
+ * Mike Crawford
+ * Ben Maurer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/**
+ * The reCAPTCHA server URL's
+ */
+define( "RECAPTCHA_API_SERVER", "http://www.google.com/recaptcha/api" );
+define( "RECAPTCHA_API_SECURE_SERVER", "https://www.google.com/recaptcha/api" );
+define( "RECAPTCHA_VERIFY_SERVER", "www.google.com" );
+
+/**
+ * Encodes the given data into a query string format
+ * @param $data - array of string elements to be encoded
+ * @return string - encoded request
+ */
+function _recaptcha_qsencode ( $data ) {
+ $req = "";
+ foreach ( $data as $key => $value )
+ $req .= $key . '=' . urlencode( stripslashes( $value ) ) . '&';
+
+ // Cut the last '&'
+ $req = substr( $req, 0, strlen( $req ) -1 );
+ return $req;
+}
+
+
+
+/**
+ * Submits an HTTP POST to a reCAPTCHA server
+ * @param string $host
+ * @param string $path
+ * @param array $data
+ * @param int port
+ * @return array response
+ */
+function _recaptcha_http_post( $host, $path, $data, $port = 80 ) {
+
+ $req = _recaptcha_qsencode ( $data );
+
+ $http_request = "POST $path HTTP/1.0\r\n";
+ $http_request .= "Host: $host\r\n";
+ $http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n";
+ $http_request .= "Content-Length: " . strlen( $req ) . "\r\n";
+ $http_request .= "User-Agent: reCAPTCHA/PHP\r\n";
+ $http_request .= "\r\n";
+ $http_request .= $req;
+
+ $response = '';
+ if ( false == ( $fs = @fsockopen( $host, $port, $errno, $errstr, 10 ) ) ) {
+ die ( 'Could not open socket' );
+ }
+
+ fwrite( $fs, $http_request );
+
+ while ( !feof( $fs ) )
+ $response .= fgets( $fs, 1160 ); // One TCP-IP packet
+ fclose( $fs );
+ $response = explode( "\r\n\r\n", $response, 2 );
+
+ return $response;
+}
+
+
+
+/**
+ * Gets the challenge HTML (javascript and non-javascript version).
+ * This is called from the browser, and the resulting reCAPTCHA HTML widget
+ * is embedded within the HTML form it was called from.
+ * @param string $pubkey A public key for reCAPTCHA
+ * @param string $error The error given by reCAPTCHA (optional, default is null)
+ * @param boolean $use_ssl Should the request be made over ssl? (optional, default is false)
+
+ * @return string - The HTML to be embedded in the user's form.
+ */
+function recaptcha_get_html ( $pubkey, $error = null, $use_ssl = false )
+{
+ if ( $pubkey == null || $pubkey == '' ) {
+ die ( "To use reCAPTCHA you must get an API key from <a href='https://www.google.com/recaptcha/admin/create'>https://www.google.com/recaptcha/admin/create</a>" );
+ }
+
+ if ( $use_ssl ) {
+ $server = RECAPTCHA_API_SECURE_SERVER;
+ } else {
+ $server = RECAPTCHA_API_SERVER;
+ }
+
+ $errorpart = "";
+ if ( $error ) {
+ $errorpart = "&amp;error=" . $error;
+ }
+ return '<script type="text/javascript" src="' . $server . '/challenge?k=' . $pubkey . $errorpart . '"></script>
+
+ <noscript>
+ <iframe src="' . $server . '/noscript?k=' . $pubkey . $errorpart . '" height="300" width="500" frameborder="0"></iframe><br/>
+ <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
+ <input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
+ </noscript>';
+}
+
+
+
+
+/**
+ * A ReCaptchaResponse is returned from recaptcha_check_answer()
+ */
+class ReCaptchaResponse {
+ public $is_valid;
+ public $error;
+}
+
+
+/**
+ * Calls an HTTP POST function to verify if the user's guess was correct
+ * @param string $privkey
+ * @param string $remoteip
+ * @param string $challenge
+ * @param string $response
+ * @param array $extra_params an array of extra variables to post to the server
+ * @return ReCaptchaResponse
+ */
+function recaptcha_check_answer ( $privkey, $remoteip, $challenge, $response, $extra_params = array() )
+{
+ if ( $privkey == null || $privkey == '' ) {
+ die ( "To use reCAPTCHA you must get an API key from <a href='https://www.google.com/recaptcha/admin/create'>https://www.google.com/recaptcha/admin/create</a>" );
+ }
+
+ if ( $remoteip == null || $remoteip == '' ) {
+ die ( "For security reasons, you must pass the remote ip to reCAPTCHA" );
+ }
+
+
+
+ // discard spam submissions
+ if ( $challenge == null || strlen( $challenge ) == 0 || $response == null || strlen( $response ) == 0 ) {
+ $recaptcha_response = new ReCaptchaResponse();
+ $recaptcha_response->is_valid = false;
+ $recaptcha_response->error = 'incorrect-captcha-sol';
+ return $recaptcha_response;
+ }
+
+ $response = _recaptcha_http_post ( RECAPTCHA_VERIFY_SERVER, "/recaptcha/api/verify",
+ array (
+ 'privatekey' => $privkey,
+ 'remoteip' => $remoteip,
+ 'challenge' => $challenge,
+ 'response' => $response
+ ) + $extra_params
+ );
+
+ $answers = explode ( "\n", $response [1] );
+ $recaptcha_response = new ReCaptchaResponse();
+
+ if ( trim ( $answers [0] ) == 'true' ) {
+ $recaptcha_response->is_valid = true;
+ }
+ else {
+ $recaptcha_response->is_valid = false;
+ $recaptcha_response->error = $answers [1];
+ }
+ return $recaptcha_response;
+
+}
+
+/**
+ * gets a URL where the user can sign up for reCAPTCHA. If your application
+ * has a configuration page where you enter a key, you should provide a link
+ * using this function.
+ * @param string $domain The domain where the page is hosted
+ * @param string $appname The name of your application
+ */
+function recaptcha_get_signup_url ( $domain = null, $appname = null ) {
+ return "https://www.google.com/recaptcha/admin/create?" . _recaptcha_qsencode ( array ( 'domains' => $domain, 'app' => $appname ) );
+}
+
+function _recaptcha_aes_pad( $val ) {
+ $block_size = 16;
+ $numpad = $block_size - ( strlen ( $val ) % $block_size );
+ return str_pad( $val, strlen ( $val ) + $numpad, chr( $numpad ) );
+}
+
+/* Mailhide related code */
+
+function _recaptcha_aes_encrypt( $val, $ky ) {
+ if ( ! function_exists ( "mcrypt_encrypt" ) ) {
+ die ( "To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed." );
+ }
+ $mode = MCRYPT_MODE_CBC;
+ $enc = MCRYPT_RIJNDAEL_128;
+ $val = _recaptcha_aes_pad( $val );
+ return mcrypt_encrypt( $enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" );
+}
+
+
+function _recaptcha_mailhide_urlbase64 ( $x ) {
+ return strtr( base64_encode ( $x ), '+/', '-_' );
+}
+
+/* gets the reCAPTCHA Mailhide url for a given email, public key and private key */
+function recaptcha_mailhide_url( $pubkey, $privkey, $email ) {
+ if ( $pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null ) {
+ die ( "To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " .
+ "you can do so at <a href='http://www.google.com/recaptcha/mailhide/apikey'>http://www.google.com/recaptcha/mailhide/apikey</a>" );
+ }
+
+
+ $ky = pack( 'H*', $privkey );
+ $cryptmail = _recaptcha_aes_encrypt ( $email, $ky );
+
+ return "http://www.google.com/recaptcha/mailhide/d?k=" . $pubkey . "&c=" . _recaptcha_mailhide_urlbase64 ( $cryptmail );
+}
+
+/**
+ * gets the parts of the email to expose to the user.
+ * eg, given johndoe@example,com return ["john", "example.com"].
+ * the email is then displayed as john...@example.com
+ */
+function _recaptcha_mailhide_email_parts ( $email ) {
+ $arr = preg_split( "/@/", $email );
+
+ if ( strlen ( $arr[0] ) <= 4 ) {
+ $arr[0] = substr ( $arr[0], 0, 1 );
+ } elseif ( strlen ( $arr[0] ) <= 6 ) {
+ $arr[0] = substr ( $arr[0], 0, 3 );
+ } else {
+ $arr[0] = substr ( $arr[0], 0, 4 );
+ }
+ return $arr;
+}
+
+/**
+ * Gets html to display an email address given a public an private key.
+ * to get a key, go to:
+ *
+ * http://www.google.com/recaptcha/mailhide/apikey
+ */
+function recaptcha_mailhide_html( $pubkey, $privkey, $email ) {
+ $emailparts = _recaptcha_mailhide_email_parts ( $email );
+ $url = recaptcha_mailhide_url ( $pubkey, $privkey, $email );
+
+ return htmlentities( $emailparts[0] ) . "<a href='" . htmlentities ( $url ) .
+ "' onclick=\"window.open('" . htmlentities ( $url ) . "', '', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=500,height=300'); return false;\" title=\"Reveal this e-mail address\">...</a>@" . htmlentities ( $emailparts [1] );
+
+}