{event name='sections'}
- {include file='captcha'}
+ {include file='captcha' supportsAsyncCaptcha=true}
<div class="formSubmit">
<input type="submit" value="{lang}wcf.global.button.submit{/lang}" accesskey="s">
{event name='sections'}
- {include file='captcha'}
+ {include file='captcha' supportsAsyncCaptcha=true}
<div class="formSubmit">
<input type="submit" value="{lang}wcf.global.button.submit{/lang}" accesskey="s">
</dl>
</section>
{else}
- <section class="section">
- <h2 class="sectionTitle">{lang}wcf.recaptcha.title{/lang}</h2>
- {assign var="recaptchaBucketID" value=true|microtime|sha1}
- <dl class="{if $errorField|isset && $errorField == 'recaptchaString'}formError{/if}">
- <dt></dt>
- <dd>
- <div id="recaptchaBucket{$recaptchaBucketID}"></div>
- <noscript>
- <div style="width: 302px; height: 473px;">
- <div style="width: 302px; height: 422px; position: relative;">
+ {if $supportsAsyncCaptcha|isset && $supportsAsyncCaptcha}
+ <section class="section">
+ <h2 class="sectionTitle">{lang}wcf.recaptcha.title{/lang}</h2>
+ {assign var="recaptchaBucketID" value=true|microtime|sha1}
+ <dl class="{if $errorField|isset && $errorField == 'recaptchaString'}formError{/if}">
+ <dt></dt>
+ <dd>
+ <div id="recaptchaBucket{$recaptchaBucketID}"></div>
+ <noscript>
+ <div style="width: 302px; height: 473px;">
<div style="width: 302px; height: 422px; position: relative;">
- <iframe src="https://www.google.com/recaptcha/api/fallback?k={RECAPTCHA_PUBLICKEY|encodeJS}" frameborder="0" scrolling="no" style="width: 302px; height:422px; border-style: none;"></iframe>
- </div>
- <div style="width: 300px; height: 60px; position: relative; border-style: none; bottom: 12px; left: 0; margin: 0px; padding: 0px; right: 25px; background: #f9f9f9; border: 1px solid #c1c1c1; border-radius: 3px;">
- <textarea name="g-recaptcha-response" class="g-recaptcha-response" style="width: 290px; height: 50px; border: 1px solid #c1c1c1; margin: 5px; padding: 0px; resize: none;"></textarea>
+ <div style="width: 302px; height: 422px; position: relative;">
+ <iframe src="https://www.google.com/recaptcha/api/fallback?k={RECAPTCHA_PUBLICKEY|encodeJS}" frameborder="0" scrolling="no" style="width: 302px; height:422px; border-style: none;"></iframe>
+ </div>
+ <div style="width: 300px; height: 60px; position: relative; border-style: none; bottom: 12px; left: 0; margin: 0px; padding: 0px; right: 25px; background: #f9f9f9; border: 1px solid #c1c1c1; border-radius: 3px;">
+ <textarea name="g-recaptcha-response" class="g-recaptcha-response" style="width: 290px; height: 50px; border: 1px solid #c1c1c1; margin: 5px; padding: 0px; resize: none;"></textarea>
+ </div>
</div>
</div>
- </div>
- </noscript>
- {if (($errorType|isset && $errorType|is_array && $errorType[recaptchaString]|isset) || ($errorField|isset && $errorField == 'recaptchaString'))}
- {if $errorType|is_array && $errorType[recaptchaString]|isset}
- {assign var='__errorType' value=$errorType[recaptchaString]}
- {else}
- {assign var='__errorType' value=$errorType}
- {/if}
- <small class="innerError">
- {if $__errorType == 'empty'}
- {lang}wcf.global.form.error.empty{/lang}
+ </noscript>
+ {if (($errorType|isset && $errorType|is_array && $errorType[recaptchaString]|isset) || ($errorField|isset && $errorField == 'recaptchaString'))}
+ {if $errorType|is_array && $errorType[recaptchaString]|isset}
+ {assign var='__errorType' value=$errorType[recaptchaString]}
{else}
- {lang}wcf.captcha.recaptchaV2.error.recaptchaString.{$__errorType}{/lang}
+ {assign var='__errorType' value=$errorType}
{/if}
- </small>
+ <small class="innerError">
+ {if $__errorType == 'empty'}
+ {lang}wcf.global.form.error.empty{/lang}
+ {else}
+ {lang}wcf.captcha.recaptchaInvisible.error.recaptchaString.{$__errorType}{/lang}
+ {/if}
+ </small>
+ {/if}
+ </dd>
+ </dl>
+ <script data-relocate="true">
+ if (!WCF.recaptcha) {
+ WCF.recaptcha = {
+ queue: [],
+ callbackCalled: false,
+ mapping: { }
+ };
+
+ // this needs to be in global scope
+ function recaptchaCallback() {
+ var bucketId;
+ WCF.recaptcha.callbackCalled = true;
+
+ // clear queue
+ while (config = WCF.recaptcha.queue.shift()) {
+ (function (config) {
+ var bucketId = config.bucket;
+
+ require(['Dom/Traverse', 'Dom/Util'], function (DomTraverse, DomUtil) {
+ var bucket = elById(bucketId);
+
+ var promise = new Promise(function (resolve, reject) {
+ WCF.recaptcha.mapping['recaptchaBucket{$recaptchaBucketID}'] = grecaptcha.render(bucket, {
+ sitekey: '{RECAPTCHA_PUBLICKEY|encodeJS}',
+ size: 'invisible',
+ badge: 'inline',
+ callback: resolve
+ });
+ });
+
+ if (config.ajaxCaptcha) {
+ WCF.System.Captcha.addCallback(config.ajaxCaptcha, function() {
+ grecaptcha.execute(WCF.recaptcha.mapping['recaptchaBucket{$recaptchaBucketID}']);
+ return promise.then(function (token) {
+ return {
+ 'g-recaptcha-response': token
+ };
+ });
+ });
+ }
+ else {
+ var form = DomTraverse.parentByTag(bucket, 'FORM');
+
+ var pressed = undefined;
+ elBySelAll('input[type=submit]', form, function (button) {
+ button.addEventListener('click', function (event) {
+ pressed = button;
+ });
+ });
+
+ var listener = function (event) {
+ event.preventDefault();
+ promise.then(function (token) {
+ form.removeEventListener('submit', listener);
+ pressed.disabled = false;
+ pressed.click();
+ });
+ grecaptcha.execute(WCF.recaptcha.mapping['recaptchaBucket{$recaptchaBucketID}']);
+ }
+ form.addEventListener('submit', listener);
+ }
+
+ });
+ })(config);
+ }
+ }
+ }
+
+ // add captcha to queue
+ WCF.recaptcha.queue.push({
+ bucket: 'recaptchaBucket{$recaptchaBucketID}'
+ {if $ajaxCaptcha|isset && $ajaxCaptcha}
+ , ajaxCaptcha: '{$captchaID}'
{/if}
- </dd>
- </dl>
- <script data-relocate="true">
- if (!WCF.recaptcha) {
- WCF.recaptcha = {
- queue: [],
- callbackCalled: false,
- mapping: { }
- };
+ });
+
+ // trigger callback immediately, if API already is available
+ if (WCF.recaptcha.callbackCalled) setTimeout(recaptchaCallback, 1);
- // this needs to be in global scope
- function recaptchaCallback() {
- var bucket;
- WCF.recaptcha.callbackCalled = true;
+ // ensure recaptcha API is loaded at most once
+ if (!window.grecaptcha) $.getScript('https://www.google.com/recaptcha/api.js?render=explicit&onload=recaptchaCallback');
+ </script>
+ </section>
+ {else}
+ <section class="section">
+ <h2 class="sectionTitle">{lang}wcf.recaptcha.title{/lang}</h2>
+ {assign var="recaptchaBucketID" value=true|microtime|sha1}
+ <dl class="{if $errorField|isset && $errorField == 'recaptchaString'}formError{/if}">
+ <dt></dt>
+ <dd>
+ <div id="recaptchaBucket{$recaptchaBucketID}"></div>
+ <noscript>
+ <div style="width: 302px; height: 473px;">
+ <div style="width: 302px; height: 422px; position: relative;">
+ <div style="width: 302px; height: 422px; position: relative;">
+ <iframe src="https://www.google.com/recaptcha/api/fallback?k={RECAPTCHA_PUBLICKEY|encodeJS}" frameborder="0" scrolling="no" style="width: 302px; height:422px; border-style: none;"></iframe>
+ </div>
+ <div style="width: 300px; height: 60px; position: relative; border-style: none; bottom: 12px; left: 0; margin: 0px; padding: 0px; right: 25px; background: #f9f9f9; border: 1px solid #c1c1c1; border-radius: 3px;">
+ <textarea name="g-recaptcha-response" class="g-recaptcha-response" style="width: 290px; height: 50px; border: 1px solid #c1c1c1; margin: 5px; padding: 0px; resize: none;"></textarea>
+ </div>
+ </div>
+ </div>
+ </noscript>
+ {if (($errorType|isset && $errorType|is_array && $errorType[recaptchaString]|isset) || ($errorField|isset && $errorField == 'recaptchaString'))}
+ {if $errorType|is_array && $errorType[recaptchaString]|isset}
+ {assign var='__errorType' value=$errorType[recaptchaString]}
+ {else}
+ {assign var='__errorType' value=$errorType}
+ {/if}
+ <small class="innerError">
+ {if $__errorType == 'empty'}
+ {lang}wcf.global.form.error.empty{/lang}
+ {else}
+ {lang}wcf.captcha.recaptchaV2.error.recaptchaString.{$__errorType}{/lang}
+ {/if}
+ </small>
+ {/if}
+ </dd>
+ </dl>
+ <script data-relocate="true">
+ if (!WCF.recaptcha) {
+ WCF.recaptcha = {
+ queue: [],
+ callbackCalled: false,
+ mapping: { }
+ };
- // clear queue
- while (bucket = WCF.recaptcha.queue.shift()) {
- WCF.recaptcha.mapping[bucket] = grecaptcha.render(bucket, {
- 'sitekey' : '{RECAPTCHA_PUBLICKEY|encodeJS}'
- });
+ // this needs to be in global scope
+ function recaptchaCallback() {
+ var bucket;
+ WCF.recaptcha.callbackCalled = true;
+
+ // clear queue
+ while (bucket = WCF.recaptcha.queue.shift()) {
+ WCF.recaptcha.mapping[bucket] = grecaptcha.render(bucket, {
+ 'sitekey' : '{RECAPTCHA_PUBLICKEY|encodeJS}'
+ });
+ }
}
}
- }
-
- // add captcha to queue
- WCF.recaptcha.queue.push('recaptchaBucket{$recaptchaBucketID}');
-
- // trigger callback immediately, if API already is available
- if (WCF.recaptcha.callbackCalled) setTimeout(recaptchaCallback, 1);
-
- {if $ajaxCaptcha|isset && $ajaxCaptcha}
- WCF.System.Captcha.addCallback('{$captchaID}', function() {
- return {
- 'g-recaptcha-response': grecaptcha.getResponse(WCF.recaptcha.mapping['recaptchaBucket{$recaptchaBucketID}'])
- };
- });
+
+ // add captcha to queue
+ WCF.recaptcha.queue.push('recaptchaBucket{$recaptchaBucketID}');
+
+ // trigger callback immediately, if API already is available
+ if (WCF.recaptcha.callbackCalled) setTimeout(recaptchaCallback, 1);
+
+ {if $ajaxCaptcha|isset && $ajaxCaptcha}
+ WCF.System.Captcha.addCallback('{$captchaID}', function() {
+ return {
+ 'g-recaptcha-response': grecaptcha.getResponse(WCF.recaptcha.mapping['recaptchaBucket{$recaptchaBucketID}'])
+ };
+ });
+ {/if}
+
+ // ensure recaptcha API is loaded at most once
+ if (!window.grecaptcha) $.getScript('https://www.google.com/recaptcha/api.js?render=explicit&onload=recaptchaCallback');
+ </script>
+ </section>
{/if}
-
- // ensure recaptcha API is loaded at most once
- if (!window.grecaptcha) $.getScript('https://www.google.com/recaptcha/api.js?render=explicit&onload=recaptchaCallback');
- </script>
- </section>
{/if}
{/if}
{event name='sections'}
- {include file='captcha'}
+ {include file='captcha' supportsAsyncCaptcha=true}
<div class="formSubmit">
<input type="submit" value="{lang}wcf.global.button.submit{/lang}" accesskey="s">
{/if}
{/foreach}
- {include file='captcha'}
+ {include file='captcha' supportsAsyncCaptcha=true}
<div class="formSubmit">
<input type="submit" value="{lang}wcf.global.button.submit{/lang}" accesskey="s">
</dd>
</dl>
- {include file='captcha'}
+ {include file='captcha' supportsAsyncCaptcha=true}
<div class="formSubmit">
<input type="submit" value="{lang}wcf.global.button.submit{/lang}" accesskey="s">
</dl>
</section>
{else}
- <section class="section">
- <h2 class="sectionTitle">{lang}wcf.recaptcha.title{/lang}</h2>
- {assign var="recaptchaBucketID" value=true|microtime|sha1}
- <dl class="{if $errorField|isset && $errorField == 'recaptchaString'}formError{/if}">
- <dt></dt>
- <dd>
- <div id="recaptchaBucket{$recaptchaBucketID}"></div>
- <noscript>
- <div style="width: 302px; height: 352px;">
- <div style="width: 302px; height: 352px; position: relative;">
- <div style="width: 302px; height: 352px; position: absolute;">
- <iframe src="https://www.google.com/recaptcha/api/fallback?k={RECAPTCHA_PUBLICKEY|encodeJS}" frameborder="0" scrolling="no" style="width: 302px; height:352px; border-style: none;"></iframe>
- </div>
- <div style="width: 250px; height: 80px; position: absolute; border-style: none; bottom: 21px; left: 25px; margin: 0px; padding: 0px; right: 25px;">
- <textarea name="g-recaptcha-response" class="g-recaptcha-response" style="width: 250px; height: 80px; border: 1px solid #c1c1c1; margin: 0px; padding: 0px; resize: none;"></textarea>
+ {if $supportsAsyncCaptcha|isset && $supportsAsyncCaptcha}
+ <section class="section">
+ <h2 class="sectionTitle">{lang}wcf.recaptcha.title{/lang}</h2>
+ {assign var="recaptchaBucketID" value=true|microtime|sha1}
+ <dl class="{if $errorField|isset && $errorField == 'recaptchaString'}formError{/if}">
+ <dt></dt>
+ <dd>
+ <div id="recaptchaBucket{$recaptchaBucketID}"></div>
+ <noscript>
+ <div style="width: 302px; height: 473px;">
+ <div style="width: 302px; height: 422px; position: relative;">
+ <div style="width: 302px; height: 422px; position: relative;">
+ <iframe src="https://www.google.com/recaptcha/api/fallback?k={RECAPTCHA_PUBLICKEY|encodeJS}" frameborder="0" scrolling="no" style="width: 302px; height:422px; border-style: none;"></iframe>
+ </div>
+ <div style="width: 300px; height: 60px; position: relative; border-style: none; bottom: 12px; left: 0; margin: 0px; padding: 0px; right: 25px; background: #f9f9f9; border: 1px solid #c1c1c1; border-radius: 3px;">
+ <textarea name="g-recaptcha-response" class="g-recaptcha-response" style="width: 290px; height: 50px; border: 1px solid #c1c1c1; margin: 5px; padding: 0px; resize: none;"></textarea>
+ </div>
</div>
</div>
- </div>
- </noscript>
- {if (($errorType|isset && $errorType|is_array && $errorType[recaptchaString]|isset) || ($errorField|isset && $errorField == 'recaptchaString'))}
- {if $errorType|is_array && $errorType[recaptchaString]|isset}
- {assign var='__errorType' value=$errorType[recaptchaString]}
- {else}
- {assign var='__errorType' value=$errorType}
- {/if}
- <small class="innerError">
- {if $__errorType == 'empty'}
- {lang}wcf.global.form.error.empty{/lang}
+ </noscript>
+ {if (($errorType|isset && $errorType|is_array && $errorType[recaptchaString]|isset) || ($errorField|isset && $errorField == 'recaptchaString'))}
+ {if $errorType|is_array && $errorType[recaptchaString]|isset}
+ {assign var='__errorType' value=$errorType[recaptchaString]}
{else}
- {lang}wcf.captcha.recaptchaV2.error.recaptchaString.{$__errorType}{/lang}
+ {assign var='__errorType' value=$errorType}
{/if}
- </small>
+ <small class="innerError">
+ {if $__errorType == 'empty'}
+ {lang}wcf.global.form.error.empty{/lang}
+ {else}
+ {lang}wcf.captcha.recaptchaInvisible.error.recaptchaString.{$__errorType}{/lang}
+ {/if}
+ </small>
+ {/if}
+ </dd>
+ </dl>
+ <script data-relocate="true">
+ if (!WCF.recaptcha) {
+ WCF.recaptcha = {
+ queue: [],
+ callbackCalled: false,
+ mapping: { }
+ };
+
+ // this needs to be in global scope
+ function recaptchaCallback() {
+ var bucketId;
+ WCF.recaptcha.callbackCalled = true;
+
+ // clear queue
+ while (config = WCF.recaptcha.queue.shift()) {
+ (function (config) {
+ var bucketId = config.bucket;
+
+ require(['Dom/Traverse', 'Dom/Util'], function (DomTraverse, DomUtil) {
+ var bucket = elById(bucketId);
+
+ var promise = new Promise(function (resolve, reject) {
+ WCF.recaptcha.mapping['recaptchaBucket{$recaptchaBucketID}'] = grecaptcha.render(bucket, {
+ sitekey: '{RECAPTCHA_PUBLICKEY|encodeJS}',
+ size: 'invisible',
+ badge: 'inline',
+ callback: resolve
+ });
+ });
+
+ if (config.ajaxCaptcha) {
+ WCF.System.Captcha.addCallback(config.ajaxCaptcha, function() {
+ grecaptcha.execute(WCF.recaptcha.mapping['recaptchaBucket{$recaptchaBucketID}']);
+ return promise.then(function (token) {
+ return {
+ 'g-recaptcha-response': token
+ };
+ });
+ });
+ }
+ else {
+ var form = DomTraverse.parentByTag(bucket, 'FORM');
+
+ var pressed = undefined;
+ elBySelAll('input[type=submit]', form, function (button) {
+ button.addEventListener('click', function (event) {
+ pressed = button;
+ });
+ });
+
+ var listener = function (event) {
+ event.preventDefault();
+ promise.then(function (token) {
+ form.removeEventListener('submit', listener);
+ pressed.disabled = false;
+ pressed.click();
+ });
+ grecaptcha.execute(WCF.recaptcha.mapping['recaptchaBucket{$recaptchaBucketID}']);
+ }
+ form.addEventListener('submit', listener);
+ }
+
+ });
+ })(config);
+ }
+ }
+ }
+
+ // add captcha to queue
+ WCF.recaptcha.queue.push({
+ bucket: 'recaptchaBucket{$recaptchaBucketID}'
+ {if $ajaxCaptcha|isset && $ajaxCaptcha}
+ , ajaxCaptcha: '{$captchaID}'
{/if}
- </dd>
- </dl>
- <script data-relocate="true">
- if (!WCF.recaptcha) {
- WCF.recaptcha = {
- queue: [],
- callbackCalled: false,
- mapping: { }
- };
+ });
+
+ // trigger callback immediately, if API already is available
+ if (WCF.recaptcha.callbackCalled) setTimeout(recaptchaCallback, 1);
- // this needs to be in global scope
- function recaptchaCallback() {
- var bucket;
- WCF.recaptcha.callbackCalled = true;
+ // ensure recaptcha API is loaded at most once
+ if (!window.grecaptcha) $.getScript('https://www.google.com/recaptcha/api.js?render=explicit&onload=recaptchaCallback');
+ </script>
+ </section>
+ {else}
+ <section class="section">
+ <h2 class="sectionTitle">{lang}wcf.recaptcha.title{/lang}</h2>
+ {assign var="recaptchaBucketID" value=true|microtime|sha1}
+ <dl class="{if $errorField|isset && $errorField == 'recaptchaString'}formError{/if}">
+ <dt></dt>
+ <dd>
+ <div id="recaptchaBucket{$recaptchaBucketID}"></div>
+ <noscript>
+ <div style="width: 302px; height: 473px;">
+ <div style="width: 302px; height: 422px; position: relative;">
+ <div style="width: 302px; height: 422px; position: relative;">
+ <iframe src="https://www.google.com/recaptcha/api/fallback?k={RECAPTCHA_PUBLICKEY|encodeJS}" frameborder="0" scrolling="no" style="width: 302px; height:422px; border-style: none;"></iframe>
+ </div>
+ <div style="width: 300px; height: 60px; position: relative; border-style: none; bottom: 12px; left: 0; margin: 0px; padding: 0px; right: 25px; background: #f9f9f9; border: 1px solid #c1c1c1; border-radius: 3px;">
+ <textarea name="g-recaptcha-response" class="g-recaptcha-response" style="width: 290px; height: 50px; border: 1px solid #c1c1c1; margin: 5px; padding: 0px; resize: none;"></textarea>
+ </div>
+ </div>
+ </div>
+ </noscript>
+ {if (($errorType|isset && $errorType|is_array && $errorType[recaptchaString]|isset) || ($errorField|isset && $errorField == 'recaptchaString'))}
+ {if $errorType|is_array && $errorType[recaptchaString]|isset}
+ {assign var='__errorType' value=$errorType[recaptchaString]}
+ {else}
+ {assign var='__errorType' value=$errorType}
+ {/if}
+ <small class="innerError">
+ {if $__errorType == 'empty'}
+ {lang}wcf.global.form.error.empty{/lang}
+ {else}
+ {lang}wcf.captcha.recaptchaV2.error.recaptchaString.{$__errorType}{/lang}
+ {/if}
+ </small>
+ {/if}
+ </dd>
+ </dl>
+ <script data-relocate="true">
+ if (!WCF.recaptcha) {
+ WCF.recaptcha = {
+ queue: [],
+ callbackCalled: false,
+ mapping: { }
+ };
- // clear queue
- while (bucket = WCF.recaptcha.queue.shift()) {
- WCF.recaptcha.mapping[bucket] = grecaptcha.render(bucket, {
- 'sitekey' : '{RECAPTCHA_PUBLICKEY|encodeJS}'
- });
+ // this needs to be in global scope
+ function recaptchaCallback() {
+ var bucket;
+ WCF.recaptcha.callbackCalled = true;
+
+ // clear queue
+ while (bucket = WCF.recaptcha.queue.shift()) {
+ WCF.recaptcha.mapping[bucket] = grecaptcha.render(bucket, {
+ 'sitekey' : '{RECAPTCHA_PUBLICKEY|encodeJS}'
+ });
+ }
}
}
- }
-
- // add captcha to queue
- WCF.recaptcha.queue.push('recaptchaBucket{$recaptchaBucketID}');
-
- // trigger callback immediately, if API already is available
- if (WCF.recaptcha.callbackCalled) setTimeout(recaptchaCallback, 1);
-
- {if $ajaxCaptcha|isset && $ajaxCaptcha}
- WCF.System.Captcha.addCallback('{$captchaID}', function() {
- return {
- 'g-recaptcha-response': grecaptcha.getResponse(WCF.recaptcha.mapping['recaptchaBucket{$recaptchaBucketID}'])
- };
- });
+
+ // add captcha to queue
+ WCF.recaptcha.queue.push('recaptchaBucket{$recaptchaBucketID}');
+
+ // trigger callback immediately, if API already is available
+ if (WCF.recaptcha.callbackCalled) setTimeout(recaptchaCallback, 1);
+
+ {if $ajaxCaptcha|isset && $ajaxCaptcha}
+ WCF.System.Captcha.addCallback('{$captchaID}', function() {
+ return {
+ 'g-recaptcha-response': grecaptcha.getResponse(WCF.recaptcha.mapping['recaptchaBucket{$recaptchaBucketID}'])
+ };
+ });
+ {/if}
+
+ // ensure recaptcha API is loaded at most once
+ if (!window.grecaptcha) $.getScript('https://www.google.com/recaptcha/api.js?render=explicit&onload=recaptchaCallback');
+ </script>
+ </section>
{/if}
-
- // ensure recaptcha API is loaded at most once
- if (!window.grecaptcha) $.getScript('https://www.google.com/recaptcha/api.js?render=explicit&onload=recaptchaCallback');
- </script>
- </section>
{/if}
{/if}
</dl>
</section>
- {include file='captcha'}
+ {include file='captcha' supportsAsyncCaptcha=true}
<section class="section">
<header class="sectionHeader">
//noinspection JSCheckFunctionSignatures
var captchaId = elData(event.currentTarget, 'captcha-id');
if (ControllerCaptcha.has(captchaId)) {
- parameters = Core.extend(parameters, ControllerCaptcha.getData(captchaId));
+ var data = ControllerCaptcha.getData(captchaId);
+ if (data instanceof Promise) {
+ data.then((function (data) {
+ parameters = Core.extend(parameters, data);
+ this._submit(undefined, parameters);
+ }).bind(this));
+ }
+ else {
+ parameters = Core.extend(parameters, ControllerCaptcha.getData(captchaId));
+ this._submit(undefined, parameters);
+ }
+ }
+ else {
+ this._submit(undefined, parameters);
}
-
- this._submit(undefined, parameters);
},
/**
<item name="wcf.captcha.recaptchaV2.error.recaptchaString.false"><![CDATA[Bitte {if LANGUAGE_USE_INFORMAL_VARIANT}bestätige{else}bestätigen Sie{/if}, dass {if LANGUAGE_USE_INFORMAL_VARIANT}du kein Roboter bist{else}Sie kein Roboter sind{/if}.]]></item>
</category>
+ <category name="wcf.captcha.recaptchaInvisible">
+ <item name="wcf.captcha.recaptchaInvisible.error.recaptchaString.false"><![CDATA[Die Überprüfung ist fehlgeschlagen. Bitte {if LANGUAGE_USE_INFORMAL_VARIANT}sende{else}senden Sie{/if} das Formular erneut ab.]]></item>
+ </category>
+
<category name="wcf.category">
<item name="wcf.category.add"><![CDATA[Kategorie hinzufügen]]></item>
<item name="wcf.category.button.list"><![CDATA[Kategorien auflisten]]></item>
<item name="wcf.captcha.recaptchaV2.error.recaptchaString.false"><![CDATA[Please confirm that you are not a robot.]]></item>
</category>
+ <category name="wcf.captcha.recaptchaInvisible">
+ <item name="wcf.captcha.recaptchaInvisible.error.recaptchaString.false"><![CDATA[The check failed, please re-submit the form.]]></item>
+ </category>
+
<category name="wcf.category">
<item name="wcf.category.add"><![CDATA[Add Category]]></item>
<item name="wcf.category.button.list"><![CDATA[List Categories]]></item>