diff --git a/assets/src/integrations/plugins/user-registration/userRegistrationAjaxLogin.ts b/assets/src/integrations/plugins/user-registration/userRegistrationAjaxLogin.ts new file mode 100644 index 0000000..525d8a7 --- /dev/null +++ b/assets/src/integrations/plugins/user-registration/userRegistrationAjaxLogin.ts @@ -0,0 +1,50 @@ +const LOGIN_ACTION = "action=user_registration_ajax_login_submit"; +const LOGIN_BUTTON_SELECTOR = "#user_registration_ajax_login_submit"; +const TOKEN_FIELD_NAME = "procaptcha-response"; + +const getLoginForms = (): HTMLFormElement[] => + Array.from(document.querySelectorAll(LOGIN_BUTTON_SELECTOR)) + .map((button) => button.closest("form")) + .filter((form): form is HTMLFormElement => null !== form); + +const getFormToken = (form: HTMLFormElement): string => { + const input = form.querySelector(`input[name="${TOKEN_FIELD_NAME}"]`); + + return input instanceof HTMLInputElement ? input.value : ""; +}; + +const getLoginToken = (): string => { + const forms = getLoginForms(); + // The clicked submit button is focused, so prefer its form when there are several. + const focusedForm = forms.find((form) => + form.contains(document.activeElement), + ); + const form = focusedForm || forms.find((form) => "" !== getFormToken(form)); + + return undefined !== form ? getFormToken(form) : ""; +}; + +/** + * With the "AJAX login" option on, User Registration posts only its own fields, + * so the token must be added for the WordPress authentication check to see it. + */ +const addTokenToUserRegistrationAjaxLogin = ($: JQueryStatic): void => { + $.ajaxPrefilter((options) => { + if ( + "string" !== typeof options.url || + false === options.url.includes(LOGIN_ACTION) || + "string" !== typeof options.data + ) { + return; + } + + const fields = new URLSearchParams(options.data); + + if (false === fields.has(TOKEN_FIELD_NAME)) { + fields.set(TOKEN_FIELD_NAME, getLoginToken()); + options.data = fields.toString(); + } + }); +}; + +export { addTokenToUserRegistrationAjaxLogin }; diff --git a/assets/src/integrations/procaptcha/ajaxFormsReset.ts b/assets/src/integrations/procaptcha/ajaxFormsReset.ts index 99d1f2b..8d68d19 100644 --- a/assets/src/integrations/procaptcha/ajaxFormsReset.ts +++ b/assets/src/integrations/procaptcha/ajaxFormsReset.ts @@ -141,6 +141,17 @@ const bindJQueryEvents = ($: JQueryStatic): void => { "user_registration_frontend_after_ajax_complete", (_event, _response, _type, $form) => requestReset($form), ); + // AJAX login: passes the submit button. On success the page redirects. + $document.on("user_registration_after_login_failed", (_event, $button) => + requestReset( + null !== $button && + "object" === typeof $button && + "closest" in $button && + "function" === typeof $button.closest + ? $button.closest("form") + : null, + ), + ); $(document.body).on("checkout_error", () => requestReset(document.querySelector("form.checkout")), diff --git a/assets/src/integrations/procaptcha/procaptcha-integration.ts b/assets/src/integrations/procaptcha/procaptcha-integration.ts index 26ef3a4..e026e59 100644 --- a/assets/src/integrations/procaptcha/procaptcha-integration.ts +++ b/assets/src/integrations/procaptcha/procaptcha-integration.ts @@ -4,6 +4,7 @@ import type Logger from "../../utils/logger/logger.js"; import FormIntegrationComponent from "#integrations/procaptcha/formIntegrationComponent.js"; import WidgetIntegrationComponent from "#integrations/procaptcha/widgetIntegrationComponent.js"; import { resetWidgetsAfterAjaxSubmissions } from "#integrations/procaptcha/ajaxFormsReset.js"; +import { addTokenToUserRegistrationAjaxLogin } from "#integrations/plugins/user-registration/userRegistrationAjaxLogin.js"; const integrationConnector = createIntegrationConnector(); @@ -40,3 +41,7 @@ integrationConnector.connectIntegration(formIntegration); integrationConnector.connectIntegration(widgetIntegration); resetWidgetsAfterAjaxSubmissions(); + +if ("function" === typeof window.jQuery) { + addTokenToUserRegistrationAjaxLogin(window.jQuery); +} diff --git a/assets/src/integrations/procaptcha/widgetIntegrationComponent.ts b/assets/src/integrations/procaptcha/widgetIntegrationComponent.ts index 2b83e4f..2791ccb 100644 --- a/assets/src/integrations/procaptcha/widgetIntegrationComponent.ts +++ b/assets/src/integrations/procaptcha/widgetIntegrationComponent.ts @@ -161,10 +161,6 @@ class WidgetIntegrationComponent implements WebComponent { clearToken, globalAttributes["expired-callback"], ), - "error-callback": this.chainCallback( - clearToken, - globalAttributes["error-callback"], - ), "reset-callback": this.chainCallback( clearToken, globalAttributes["reset-callback"], @@ -219,7 +215,8 @@ class WidgetIntegrationComponent implements WebComponent { } /** - * Called when the token expires, the widget errors or is reset: + * Called when the token expires or the widget is reset (not on errors: those include failed + * background requests, which don't invalidate a token the visitor already has): * the Procaptcha's JS removes its own input, but the custom one must be cleared manually, * otherwise JS-based forms keep submitting a token that the server will reject. */ diff --git a/php-tools/code-quality/tests/Unit/Visitor_Ip_Test.php b/php-tools/code-quality/tests/Unit/Visitor_Ip_Test.php new file mode 100644 index 0000000..e56fe72 --- /dev/null +++ b/php-tools/code-quality/tests/Unit/Visitor_Ip_Test.php @@ -0,0 +1,76 @@ + '172.68.1.1', + 'HTTP_CF_CONNECTING_IP' => '203.0.113.7', + 'HTTP_X_FORWARDED_FOR' => '198.51.100.9, 10.0.0.1', + ); + + protected function tearDown(): void { + $GLOBALS['test_filters'] = array(); + Mockery::close(); + } + + public function testNothingIsSentByDefault() { + $this->assertSame( '', $this->get_visitor_ip( '' ) ); + } + + public function testCloudflareHeader() { + $this->assertSame( '203.0.113.7', $this->get_visitor_ip( Procaptcha_Settings::VISITOR_IP_CLOUDFLARE ) ); + } + + public function testCloudflareWithoutHeaderSendsNothing() { + $this->assertSame( '', $this->get_visitor_ip( Procaptcha_Settings::VISITOR_IP_CLOUDFLARE, array( 'REMOTE_ADDR' => '172.68.1.1' ) ) ); + } + + public function testFirstForwardedForAddress() { + $this->assertSame( '198.51.100.9', $this->get_visitor_ip( Procaptcha_Settings::VISITOR_IP_X_FORWARDED_FOR ) ); + } + + public function testRemoteAddr() { + $this->assertSame( '172.68.1.1', $this->get_visitor_ip( Procaptcha_Settings::VISITOR_IP_REMOTE_ADDR ) ); + } + + public function testFilterCanEnableWhenOff() { + $GLOBALS['test_filters']['prosopo/procaptcha/visitor_ip'] = fn( $ip, $remote_addr ) => $remote_addr; + + $this->assertSame( '172.68.1.1', $this->get_visitor_ip( '' ) ); + } + + public function testInvalidIpIsNotSent() { + $this->assertSame( '', $this->get_visitor_ip( Procaptcha_Settings::VISITOR_IP_CLOUDFLARE, array( 'HTTP_CF_CONNECTING_IP' => 'not-an-ip' ) ) ); + } + + protected function get_visitor_ip( string $source, array $server = self::SERVER ): string { + $_SERVER = $server; + + $settings = Mockery::mock( Procaptcha_Settings::class ); + $settings->shouldReceive( 'get_visitor_ip_source' )->andReturn( $source ); + + $widget_class = get_class( + new class() extends Procaptcha_Widget { + // Skip the parent's constructor: only the settings are needed. + public function __construct() {} + + public function visitor_ip(): string { + return $this->get_visitor_ip(); + } + } + ); + $widget = new $widget_class(); + + $settings_property = new \ReflectionProperty( Procaptcha_Widget::class, 'procaptcha_settings' ); + $settings_property->setAccessible( true ); + $settings_property->setValue( $widget, $settings ); + + return $widget->visitor_ip(); + } +} diff --git a/php-tools/code-quality/tests/bootstrap.php b/php-tools/code-quality/tests/bootstrap.php index cea9f27..8e70265 100644 --- a/php-tools/code-quality/tests/bootstrap.php +++ b/php-tools/code-quality/tests/bootstrap.php @@ -7,6 +7,23 @@ function esc_html( string $var ): string { return htmlentities( $var, ENT_QUOTES ); } +function wp_unslash( $value ) { + return $value; +} + +function sanitize_text_field( $value ) { + return $value; +} + +// Runs a callback set in $GLOBALS['test_filters'][ $hook_name ], if any. +function apply_filters( string $hook_name, $value, ...$args ) { + $callback = $GLOBALS['test_filters'][ $hook_name ] ?? null; + + return null !== $callback ? + $callback( $value, ...$args ) : + $value; +} + require_once __DIR__ . '/../vendor/autoload.php'; require_once __DIR__ . '/TestCase.php'; require_once __DIR__ . '/../../../prosopo-procaptcha/prefixed-vendors/vendor/scoper-autoload.php'; diff --git a/prosopo-procaptcha/lang/prosopo-procaptcha-de_DE.l10n.php b/prosopo-procaptcha/lang/prosopo-procaptcha-de_DE.l10n.php index 301fb6d..e07d483 100644 --- a/prosopo-procaptcha/lang/prosopo-procaptcha-de_DE.l10n.php +++ b/prosopo-procaptcha/lang/prosopo-procaptcha-de_DE.l10n.php @@ -1,2 +1,2 @@ 'prosopo-procaptcha','plural-forms'=>NULL,'language'=>'','project-id-version'=>'Prosopo ProCaptcha 1.0.0','pot-creation-date'=>'2026-10-27T13:57:59+00:00','po-revision-date'=>'YEAR-MO-DA HO:MI+ZONE','x-generator'=>'WP-CLI 2.11.0','messages'=>['Prosopo Procaptcha'=>'Prosopo Procaptcha','Free, GDPR-compliant CAPTCHA that stops spam bots on WordPress core forms and 21 form plugins, page builders and themes. No cookies.'=>'Kostenloses, DSGVO-konformes CAPTCHA gegen Spam-Bots für die WordPress-Kernformulare und 21 Formular-Plugins, Page-Builder und Themes. Ohne Cookies.','Prosopo Team'=>'Prosopo-Team','https://prosopo.io/'=>'https://prosopo.io/','Enable form protection for this forum (new topic, reply)'=>'Formularschutz für dieses Forum aktivieren (neues Thema, Antwort)','Procaptcha protection'=>'Procaptcha-Schutz','Disabled'=>'Deaktiviert','Enabled'=>'Aktiviert','Enable Procaptcha form protection'=>'Procaptcha-Formularschutz aktivieren','WooCommerce'=>'WooCommerce','Protect the checkout form'=>'Schützen Sie das Checkout-Formular','Protect the order tracking form'=>'Schützen Sie das Formular zur Bestellverfolgung','Core Forms'=>'Kernformulare','Protect the comment form:'=>'Schützen Sie das Kommentarfeld:','Protect the login form:'=>'Schützen Sie das Anmeldeformular:','Protect the lost password form:'=>'Schützen Sie das Formular für vergessenes Passwort:','Protect the post/page password form:'=>'Schützen Sie das Beitrags-/Seitenpasswort-Formular:','Protect the register form:'=>'Schützen Sie das Registrierungsformular:','Active Integrations'=>'Aktive Integrationen','The Procaptcha plugin automatically detects compatible plugins on your site and enables their integrations. Click any item below to open a corresponding Docs page.'=>'Das Procaptcha-Plugin erkennt kompatible Plugins auf Ihrer Website automatisch und aktiviert deren Integrationen. Klicken Sie auf einen Eintrag, um die passende Dokumentationsseite zu öffnen.','Note: Inactive plugins, even if compatible, are excluded.'=>'Hinweis: Inaktive Plugins werden nicht berücksichtigt, auch wenn sie kompatibel sind.','Your favourite plugin is not listed? %1$s Start a thread %2$s in our support forum and we will consider adding the new integration.'=>'Ihr Lieblings-Plugin fehlt? %1$s Starten Sie ein Thema %2$s in unserem Support-Forum, und wir prüfen eine neue Integration.','General'=>'Allgemein','Your Secret Key:'=>'Ihr geheimer Schlüssel:','Your Site Key:'=>'Ihr Website-Schlüssel:','Theme:'=>'Design:','Language:'=>'Sprache:','Require from authorized users:'=>'Von autorisierten Benutzern verlangen:','Dark'=>'Dunkel','Light'=>'Hell','Same as the site'=>'Wie die Website','Visitor\'s browser language'=>'Browsersprache des Besuchers','Behavior'=>'Verhalten','Upgrade to Professional'=>'Auf Professional upgraden','Spam Filter: blocks disposable and throwaway email addresses'=>'Spam-Filter: blockiert Wegwerf-E-Mail-Adressen','VPN, proxy and datacenter filtering'=>'Filterung von VPNs, Proxys und Rechenzentren','Choose your challenge type, plus icon-order and audio challenges'=>'Wählen Sie den Challenge-Typ, dazu Symbol-Reihenfolge- und Audio-Challenges','A risk score and block reason for every decision'=>'Risikowert und Sperrgrund für jede Entscheidung','Up to 1M requests a month and 50 sites'=>'Bis zu 1 Mio. Anfragen pro Monat und 50 Websites','Email and Discord support, 99.9% uptime'=>'Support per E-Mail und Discord, 99,9 % Verfügbarkeit','Start a 30-day free trial'=>'30 Tage kostenlos testen','Procaptcha Settings'=>'Procaptcha-Einstellungen','Procaptcha'=>'Procaptcha','Settings'=>'Einstellungen','Statistics'=>'Statistiken','Open the Portal'=>'Portal öffnen','Usage and settings for your site key. Manage your account and site settings in the Prosopo portal.'=>'Nutzung und Einstellungen Ihres Site-Keys. Konto und Website-Einstellungen verwalten Sie im Prosopo-Portal.','Your Site Key'=>'Ihr Site-Key','Change in the portal'=>'Im Portal ändern','Your plan lets you choose the challenge type for this site key in the Prosopo portal.'=>'Mit Ihrem Tarif wählen Sie den Challenge-Typ für diesen Site-Key im Prosopo-Portal.','Procaptcha shows a challenge only to visitors who look like bots, and picks a Proof of Work, image or jigsaw puzzle challenge for them. Choosing a single challenge type is part of the Professional plan.'=>'Procaptcha zeigt nur Besuchern, die wie Bots wirken, eine Challenge und wählt dafür Proof of Work, Bild oder Puzzle. Einen einzelnen Challenge-Typ festlegen können Sie im Professional-Tarif.','Challenge type:'=>'Challenge-Typ:','Your Challenges'=>'Ihre Challenges','Audio'=>'Audio','Frictionless (challenge only when needed)'=>'Frictionless (Challenge nur bei Bedarf)','Icon order'=>'Symbol-Reihenfolge','Image'=>'Bild','Proof of Work'=>'Arbeitsnachweis','Jigsaw puzzle'=>'Puzzle','out of {total} visits checked this month'=>'von {total} geprüften Besuchen in diesem Monat','Bots stopped this month'=>'Diesen Monat gestoppte Bots','Checked by your server'=>'Von Ihrem Server geprüft','On track for about {forecast} of {limit} by the end of the month.'=>'Hochgerechnet etwa {forecast} von {limit} bis zum Monatsende.','On track for about {forecast} by the end of the month, over your limit of {limit}.'=>'Hochgerechnet etwa {forecast} bis zum Monatsende, über Ihrem Limit von {limit}.','Requests this month'=>'Anfragen in diesem Monat','{used} of {limit} requests used'=>'{used} von {limit} Anfragen genutzt','Day'=>'Tag','Hide the table'=>'Tabelle ausblenden','{percent}% of visitors passed the invisible check without a challenge.'=>'{percent} % der Besucher haben die unsichtbare Prüfung ohne Challenge bestanden.','Visitors who saw nothing to solve'=>'Besucher ohne Aufgabe','Requests'=>'Anfragen','Challenges served'=>'Ausgelieferte Challenges','Your server checks {percent}% of solved captchas.'=>'Ihr Server prüft {percent} % der gelösten Captchas.','Setup check'=>'Einrichtungsprüfung','Only {percent}% of solved captchas were checked by your server. A form may be accepting submissions without verifying the Procaptcha token, which lets bots skip it.'=>'Nur {percent} % der gelösten Captchas wurden von Ihrem Server geprüft. Möglicherweise nimmt ein Formular Einsendungen an, ohne das Procaptcha-Token zu verifizieren, sodass Bots es umgehen können.','How verification works'=>'So funktioniert die Verifizierung','Show as a table'=>'Als Tabelle anzeigen','Solved by visitors'=>'Von Besuchern gelöst','Total'=>'Gesamt','Your statistics could not be loaded. Check that the Site Key and Secret Key on the General tab are correct and saved, then try again.'=>'Ihre Statistiken konnten nicht geladen werden. Prüfen Sie, ob Site-Key und Secret-Key im Tab Allgemein korrekt und gespeichert sind, und versuchen Sie es erneut.','Successfully loaded at'=>'Erfolgreich geladen um','Loading, please wait.'=>'Laden, bitte warten.','Refresh now'=>'Jetzt aktualisieren','Try again'=>'Erneut versuchen','View traffic analytics'=>'Traffic-Analysen ansehen','Traffic analytics are included on every plan. See the charts in the Prosopo portal.'=>'Traffic-Analysen sind in jedem Tarif enthalten. Die Diagramme finden Sie im Prosopo-Portal.','Traffic Analytics'=>'Verkehrsanalysen','Audio:'=>'Audio:','Icon order:'=>'Symbol-Reihenfolge:','Image:'=>'Bild:','Proof of Work:'=>'Arbeitsnachweis:','Jigsaw puzzle:'=>'Puzzle:','Monthly Usage'=>'Monatliche Nutzung','Total Verification Requests:'=>'Gesamte Verifizierungsanfragen:','Please verify that you are human.'=>'Bitte bestätigen Sie, dass Sie ein Mensch sind.','Frictionless'=>'Reibungslos','Pow'=>'Pow','Save'=>'Speichern','Procaptcha for WordPress'=>'Procaptcha für WordPress','Free, GDPR-compliant CAPTCHA that stops spam bots. No cookies.'=>'Kostenloses, DSGVO-konformes CAPTCHA gegen Spam-Bots. Ohne Cookies.','Docs'=>'Dokumentation','Website'=>'Website','Prosopo portal'=>'Prosopo-Portal','Settings successfully saved.'=>'Einstellungen erfolgreich gespeichert.','Get your free site key'=>'Kostenlosen Site-Key holen','Sign up for a free Prosopo account.'=>'Registrieren Sie sich kostenlos bei Prosopo.','Copy your Site Key and Secret Key from the Prosopo portal.'=>'Kopieren Sie Site-Key und Secret-Key aus dem Prosopo-Portal.','Paste them here, save, and turn on the forms you want to protect.'=>'Fügen Sie beide hier ein, speichern Sie und aktivieren Sie die Formulare, die Sie schützen möchten.','Free for 10,000 requests a month. No credit card.'=>'Kostenlos für 10.000 Anfragen pro Monat. Keine Kreditkarte nötig.','Preview: if the credentials are valid, you should be able to complete the captcha below:'=>'Vorschau: Wenn die Anmeldedaten gültig sind, sollten Sie in der Lage sein, das Captcha unten zu vervollständigen:','What protects your forms'=>'Was Ihre Formulare schützt','An invisible check: most visitors see nothing to solve, and only visitors who look like bots get a challenge.'=>'Eine unsichtbare Prüfung: Die meisten Besucher müssen nichts lösen, nur Besucher, die wie Bots wirken, erhalten eine Challenge.','A hidden honeypot trap, and blocking of known abusive networks.'=>'Eine versteckte Honeypot-Falle und die Sperrung bekannter missbräuchlicher Netzwerke.','No cookies and no tracking.'=>'Keine Cookies und kein Tracking.','All included on the free plan.'=>'Alles im kostenlosen Tarif enthalten.','Data processing agreement'=>'Auftragsverarbeitungsvertrag','Please setup your keys to see the statistics.'=>'Bitte richten Sie Ihre Schlüssel ein, um die Statistiken zu sehen.']]; \ No newline at end of file +return ['domain'=>'prosopo-procaptcha','plural-forms'=>NULL,'language'=>'','project-id-version'=>'Prosopo ProCaptcha 1.0.0','pot-creation-date'=>'2026-10-27T13:57:59+00:00','po-revision-date'=>'YEAR-MO-DA HO:MI+ZONE','x-generator'=>'WP-CLI 2.11.0','messages'=>['Prosopo Procaptcha'=>'Prosopo Procaptcha','Free, GDPR-compliant CAPTCHA that stops spam bots on WordPress core forms and 21 form plugins, page builders and themes. No cookies.'=>'Kostenloses, DSGVO-konformes CAPTCHA gegen Spam-Bots für die WordPress-Kernformulare und 21 Formular-Plugins, Page-Builder und Themes. Ohne Cookies.','Prosopo Team'=>'Prosopo-Team','https://prosopo.io/'=>'https://prosopo.io/','Enable form protection for this forum (new topic, reply)'=>'Formularschutz für dieses Forum aktivieren (neues Thema, Antwort)','Procaptcha protection'=>'Procaptcha-Schutz','Disabled'=>'Deaktiviert','Enabled'=>'Aktiviert','Enable Procaptcha form protection'=>'Procaptcha-Formularschutz aktivieren','WooCommerce'=>'WooCommerce','Protect the checkout form'=>'Schützen Sie das Checkout-Formular','Protect the order tracking form'=>'Schützen Sie das Formular zur Bestellverfolgung','Core Forms'=>'Kernformulare','Protect the comment form:'=>'Schützen Sie das Kommentarfeld:','Protect the login form:'=>'Schützen Sie das Anmeldeformular:','Protect the lost password form:'=>'Schützen Sie das Formular für vergessenes Passwort:','Protect the post/page password form:'=>'Schützen Sie das Beitrags-/Seitenpasswort-Formular:','Protect the register form:'=>'Schützen Sie das Registrierungsformular:','Active Integrations'=>'Aktive Integrationen','The Procaptcha plugin automatically detects compatible plugins on your site and enables their integrations. Click any item below to open a corresponding Docs page.'=>'Das Procaptcha-Plugin erkennt kompatible Plugins auf Ihrer Website automatisch und aktiviert deren Integrationen. Klicken Sie auf einen Eintrag, um die passende Dokumentationsseite zu öffnen.','Note: Inactive plugins, even if compatible, are excluded.'=>'Hinweis: Inaktive Plugins werden nicht berücksichtigt, auch wenn sie kompatibel sind.','Your favourite plugin is not listed? %1$s Start a thread %2$s in our support forum and we will consider adding the new integration.'=>'Ihr Lieblings-Plugin fehlt? %1$s Starten Sie ein Thema %2$s in unserem Support-Forum, und wir prüfen eine neue Integration.','General'=>'Allgemein','Your Secret Key:'=>'Ihr geheimer Schlüssel:','Your Site Key:'=>'Ihr Website-Schlüssel:','Theme:'=>'Design:','Language:'=>'Sprache:','Require from authorized users:'=>'Von autorisierten Benutzern verlangen:','Dark'=>'Dunkel','Light'=>'Hell','Same as the site'=>'Wie die Website','Visitor\'s browser language'=>'Browsersprache des Besuchers','Behavior'=>'Verhalten','Upgrade to Professional'=>'Auf Professional upgraden','Spam Filter: blocks disposable and throwaway email addresses'=>'Spam-Filter: blockiert Wegwerf-E-Mail-Adressen','VPN, proxy and datacenter filtering'=>'Filterung von VPNs, Proxys und Rechenzentren','Choose your challenge type, plus icon-order and audio challenges'=>'Wählen Sie den Challenge-Typ, dazu Symbol-Reihenfolge- und Audio-Challenges','A risk score and block reason for every decision'=>'Risikowert und Sperrgrund für jede Entscheidung','Up to 1M requests a month and 50 sites'=>'Bis zu 1 Mio. Anfragen pro Monat und 50 Websites','Email and Discord support, 99.9% uptime'=>'Support per E-Mail und Discord, 99,9 % Verfügbarkeit','Start a 30-day free trial'=>'30 Tage kostenlos testen','Procaptcha Settings'=>'Procaptcha-Einstellungen','Procaptcha'=>'Procaptcha','Settings'=>'Einstellungen','Statistics'=>'Statistiken','Open the Portal'=>'Portal öffnen','Usage and settings for your site key. Manage your account and site settings in the Prosopo portal.'=>'Nutzung und Einstellungen Ihres Site-Keys. Konto und Website-Einstellungen verwalten Sie im Prosopo-Portal.','Your Site Key'=>'Ihr Site-Key','Change in the portal'=>'Im Portal ändern','Your plan lets you choose the challenge type for this site key in the Prosopo portal.'=>'Mit Ihrem Tarif wählen Sie den Challenge-Typ für diesen Site-Key im Prosopo-Portal.','Procaptcha shows a challenge only to visitors who look like bots, and picks a Proof of Work, image or jigsaw puzzle challenge for them. Choosing a single challenge type is part of the Professional plan.'=>'Procaptcha zeigt nur Besuchern, die wie Bots wirken, eine Challenge und wählt dafür Proof of Work, Bild oder Puzzle. Einen einzelnen Challenge-Typ festlegen können Sie im Professional-Tarif.','Challenge type:'=>'Challenge-Typ:','Your Challenges'=>'Ihre Challenges','Audio'=>'Audio','Frictionless (challenge only when needed)'=>'Frictionless (Challenge nur bei Bedarf)','Icon order'=>'Symbol-Reihenfolge','Image'=>'Bild','Proof of Work'=>'Arbeitsnachweis','Jigsaw puzzle'=>'Puzzle','out of {total} visits checked this month'=>'von {total} geprüften Besuchen in diesem Monat','Bots stopped this month'=>'Diesen Monat gestoppte Bots','Checked by your server'=>'Von Ihrem Server geprüft','On track for about {forecast} of {limit} by the end of the month.'=>'Hochgerechnet etwa {forecast} von {limit} bis zum Monatsende.','On track for about {forecast} by the end of the month, over your limit of {limit}.'=>'Hochgerechnet etwa {forecast} bis zum Monatsende, über Ihrem Limit von {limit}.','Requests this month'=>'Anfragen in diesem Monat','{used} of {limit} requests used'=>'{used} von {limit} Anfragen genutzt','Day'=>'Tag','Hide the table'=>'Tabelle ausblenden','{percent}% of visitors passed the invisible check without a challenge.'=>'{percent} % der Besucher haben die unsichtbare Prüfung ohne Challenge bestanden.','Visitors who saw nothing to solve'=>'Besucher ohne Aufgabe','Requests'=>'Anfragen','Challenges served'=>'Ausgelieferte Challenges','Your server checks {percent}% of solved captchas.'=>'Ihr Server prüft {percent} % der gelösten Captchas.','Setup check'=>'Einrichtungsprüfung','Only {percent}% of solved captchas were checked by your server. A form may be accepting submissions without verifying the Procaptcha token, which lets bots skip it.'=>'Nur {percent} % der gelösten Captchas wurden von Ihrem Server geprüft. Möglicherweise nimmt ein Formular Einsendungen an, ohne das Procaptcha-Token zu verifizieren, sodass Bots es umgehen können.','How verification works'=>'So funktioniert die Verifizierung','Show as a table'=>'Als Tabelle anzeigen','Solved by visitors'=>'Von Besuchern gelöst','Total'=>'Gesamt','Your statistics could not be loaded. Check that the Site Key and Secret Key on the General tab are correct and saved, then try again.'=>'Ihre Statistiken konnten nicht geladen werden. Prüfen Sie, ob Site-Key und Secret-Key im Tab Allgemein korrekt und gespeichert sind, und versuchen Sie es erneut.','Successfully loaded at'=>'Erfolgreich geladen um','Loading, please wait.'=>'Laden, bitte warten.','Refresh now'=>'Jetzt aktualisieren','Try again'=>'Erneut versuchen','View traffic analytics'=>'Traffic-Analysen ansehen','Traffic analytics are included on every plan. See the charts in the Prosopo portal.'=>'Traffic-Analysen sind in jedem Tarif enthalten. Die Diagramme finden Sie im Prosopo-Portal.','Traffic Analytics'=>'Verkehrsanalysen','Audio:'=>'Audio:','Icon order:'=>'Symbol-Reihenfolge:','Image:'=>'Bild:','Proof of Work:'=>'Arbeitsnachweis:','Jigsaw puzzle:'=>'Puzzle:','Monthly Usage'=>'Monatliche Nutzung','Total Verification Requests:'=>'Gesamte Verifizierungsanfragen:','Please verify that you are human.'=>'Bitte bestätigen Sie, dass Sie ein Mensch sind.','Frictionless'=>'Reibungslos','Pow'=>'Pow','Save'=>'Speichern','Procaptcha for WordPress'=>'Procaptcha für WordPress','Free, GDPR-compliant CAPTCHA that stops spam bots. No cookies.'=>'Kostenloses, DSGVO-konformes CAPTCHA gegen Spam-Bots. Ohne Cookies.','Docs'=>'Dokumentation','Website'=>'Website','Prosopo portal'=>'Prosopo-Portal','Settings successfully saved.'=>'Einstellungen erfolgreich gespeichert.','Get your free site key'=>'Kostenlosen Site-Key holen','Sign up for a free Prosopo account.'=>'Registrieren Sie sich kostenlos bei Prosopo.','Copy your Site Key and Secret Key from the Prosopo portal.'=>'Kopieren Sie Site-Key und Secret-Key aus dem Prosopo-Portal.','Paste them here, save, and turn on the forms you want to protect.'=>'Fügen Sie beide hier ein, speichern Sie und aktivieren Sie die Formulare, die Sie schützen möchten.','Free for 10,000 requests a month. No credit card.'=>'Kostenlos für 10.000 Anfragen pro Monat. Keine Kreditkarte nötig.','Preview: if the credentials are valid, you should be able to complete the captcha below:'=>'Vorschau: Wenn die Anmeldedaten gültig sind, sollten Sie in der Lage sein, das Captcha unten zu vervollständigen:','What protects your forms'=>'Was Ihre Formulare schützt','An invisible check: most visitors see nothing to solve, and only visitors who look like bots get a challenge.'=>'Eine unsichtbare Prüfung: Die meisten Besucher müssen nichts lösen, nur Besucher, die wie Bots wirken, erhalten eine Challenge.','A hidden honeypot trap, and blocking of known abusive networks.'=>'Eine versteckte Honeypot-Falle und die Sperrung bekannter missbräuchlicher Netzwerke.','No cookies and no tracking.'=>'Keine Cookies und kein Tracking.','All included on the free plan.'=>'Alles im kostenlosen Tarif enthalten.','Data processing agreement'=>'Auftragsverarbeitungsvertrag','Please setup your keys to see the statistics.'=>'Bitte richten Sie Ihre Schlüssel ein, um die Statistiken zu sehen.','Visitor IP matching:'=>'Abgleich der Besucher-IP:','Off (recommended)'=>'Aus (empfohlen)','On - site is behind Cloudflare'=>'An – Website läuft hinter Cloudflare','On - visitors connect directly (REMOTE_ADDR)'=>'An – Besucher verbinden sich direkt (REMOTE_ADDR)','On - site is behind another proxy (X-Forwarded-For)'=>'An – Website läuft hinter einem anderen Proxy (X-Forwarded-For)']]; \ No newline at end of file diff --git a/prosopo-procaptcha/lang/prosopo-procaptcha-de_DE.mo b/prosopo-procaptcha/lang/prosopo-procaptcha-de_DE.mo index aeb6c5a..1ef452c 100644 Binary files a/prosopo-procaptcha/lang/prosopo-procaptcha-de_DE.mo and b/prosopo-procaptcha/lang/prosopo-procaptcha-de_DE.mo differ diff --git a/prosopo-procaptcha/lang/prosopo-procaptcha-de_DE.po b/prosopo-procaptcha/lang/prosopo-procaptcha-de_DE.po index 14318c3..6d4624d 100644 --- a/prosopo-procaptcha/lang/prosopo-procaptcha-de_DE.po +++ b/prosopo-procaptcha/lang/prosopo-procaptcha-de_DE.po @@ -2,19 +2,20 @@ msgid "" msgstr "" "Project-Id-Version: Prosopo ProCaptcha 1.0.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/prosopo-procaptcha\n" -"POT-Creation-Date: 2026-10-27T13:57:59+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" -"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2026-10-27T13:57:59+00:00\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Language: \n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: prosopo-procaptcha\n" #. Plugin Name of the plugin -#: prosopo-procaptcha.php src/Widget/Procaptcha_Widget.php:77 +#: prosopo-procaptcha.php +#: src/Widget/Procaptcha_Widget.php:77 msgid "Prosopo Procaptcha" msgstr "Prosopo Procaptcha" @@ -111,49 +112,49 @@ msgstr "Hinweis: Inaktive Plugins werden nicht berücksichtigt, auch wenn sie ko msgid "Your favourite plugin is not listed? %1$s Start a thread %2$s in our support forum and we will consider adding the new integration." msgstr "Ihr Lieblings-Plugin fehlt? %1$s Starten Sie ein Thema %2$s in unserem Support-Forum, und wir prüfen eine neue Integration." -#: src/Settings/General/Tab/General_Settings_Tab.php:30 +#: src/Settings/General/Tab/General_Settings_Tab.php:31 msgid "General" msgstr "Allgemein" -#: src/Settings/General/Tab/General_Settings_Tab.php:99 +#: src/Settings/General/Tab/General_Settings_Tab.php:114 msgid "Your Secret Key:" msgstr "Ihr geheimer Schlüssel:" -#: src/Settings/General/Tab/General_Settings_Tab.php:100 +#: src/Settings/General/Tab/General_Settings_Tab.php:115 msgid "Your Site Key:" msgstr "Ihr Website-Schlüssel:" -#: src/Settings/General/Tab/General_Settings_Tab.php:101 +#: src/Settings/General/Tab/General_Settings_Tab.php:116 msgid "Theme:" msgstr "Design:" -#: src/Settings/General/Tab/General_Settings_Tab.php:102 +#: src/Settings/General/Tab/General_Settings_Tab.php:118 msgid "Language:" msgstr "Sprache:" -#: src/Settings/General/Tab/General_Settings_Tab.php:108 +#: src/Settings/General/Tab/General_Settings_Tab.php:124 msgid "Require from authorized users:" msgstr "Von autorisierten Benutzern verlangen:" -#: src/Settings/General/Tab/General_Settings_Tab.php:122 +#: src/Settings/General/Tab/General_Settings_Tab.php:140 #: src/Widget/Procaptcha_Widget.php:55 msgid "Dark" msgstr "Dunkel" -#: src/Settings/General/Tab/General_Settings_Tab.php:123 +#: src/Settings/General/Tab/General_Settings_Tab.php:141 #: src/Widget/Procaptcha_Widget.php:56 msgid "Light" msgstr "Hell" -#: src/Settings/General/Tab/General_Settings_Tab.php:126 +#: src/Settings/General/Tab/General_Settings_Tab.php:151 msgid "Same as the site" msgstr "Wie die Website" -#: src/Settings/General/Tab/General_Settings_Tab.php:127 +#: src/Settings/General/Tab/General_Settings_Tab.php:152 msgid "Visitor's browser language" msgstr "Browsersprache des Besuchers" -#: src/Settings/General/Tab/General_Settings_Tab.php:137 +#: src/Settings/General/Tab/General_Settings_Tab.php:162 msgid "Behavior" msgstr "Verhalten" @@ -494,3 +495,23 @@ msgstr "Auftragsverarbeitungsvertrag" #: src/Settings/Statistics/statistics_settings.blade.php:34 msgid "Please setup your keys to see the statistics." msgstr "Bitte richten Sie Ihre Schlüssel ein, um die Statistiken zu sehen." + +#: src/Settings/General/Tab/General_Settings_Tab.php:117 +msgid "Visitor IP matching:" +msgstr "Abgleich der Besucher-IP:" + +#: src/Settings/General/Tab/General_Settings_Tab.php:145 +msgid "Off (recommended)" +msgstr "Aus (empfohlen)" + +#: src/Settings/General/Tab/General_Settings_Tab.php:146 +msgid "On - site is behind Cloudflare" +msgstr "An – Website läuft hinter Cloudflare" + +#: src/Settings/General/Tab/General_Settings_Tab.php:147 +msgid "On - visitors connect directly (REMOTE_ADDR)" +msgstr "An – Besucher verbinden sich direkt (REMOTE_ADDR)" + +#: src/Settings/General/Tab/General_Settings_Tab.php:148 +msgid "On - site is behind another proxy (X-Forwarded-For)" +msgstr "An – Website läuft hinter einem anderen Proxy (X-Forwarded-For)" diff --git a/prosopo-procaptcha/lang/prosopo-procaptcha-es_ES.l10n.php b/prosopo-procaptcha/lang/prosopo-procaptcha-es_ES.l10n.php index bb17abe..52432b9 100644 --- a/prosopo-procaptcha/lang/prosopo-procaptcha-es_ES.l10n.php +++ b/prosopo-procaptcha/lang/prosopo-procaptcha-es_ES.l10n.php @@ -1,2 +1,2 @@ 'prosopo-procaptcha','plural-forms'=>NULL,'language'=>'','project-id-version'=>'Prosopo ProCaptcha 1.0.0','pot-creation-date'=>'2026-10-27T13:57:59+00:00','po-revision-date'=>'YEAR-MO-DA HO:MI+ZONE','x-generator'=>'WP-CLI 2.11.0','messages'=>['Prosopo Procaptcha'=>'Prosopo Procaptcha','Free, GDPR-compliant CAPTCHA that stops spam bots on WordPress core forms and 21 form plugins, page builders and themes. No cookies.'=>'CAPTCHA gratuito y conforme al RGPD que frena a los bots de spam en los formularios principales de WordPress y en 21 plugins de formularios, maquetadores y temas. Sin cookies.','Prosopo Team'=>'Equipo de Prosopo','https://prosopo.io/'=>'https://prosopo.io/','Enable form protection for this forum (new topic, reply)'=>'Habilitar protección de formulario para este foro (nuevo tema, respuesta)','Procaptcha protection'=>'Protección de Procaptcha','Disabled'=>'Desactivado','Enabled'=>'Activado','Enable Procaptcha form protection'=>'Activar la protección de formularios de Procaptcha','WooCommerce'=>'WooCommerce','Protect the checkout form'=>'Proteger el formulario de pago','Protect the order tracking form'=>'Proteger el formulario de seguimiento de pedidos','Core Forms'=>'Formularios principales','Protect the comment form:'=>'Proteger el formulario de comentarios:','Protect the login form:'=>'Proteger el formulario de inicio de sesión:','Protect the lost password form:'=>'Proteger el formulario de contraseña olvidada:','Protect the post/page password form:'=>'Proteger el formulario de contraseña de publicación/página:','Protect the register form:'=>'Proteger el formulario de registro:','Active Integrations'=>'Integraciones activas','The Procaptcha plugin automatically detects compatible plugins on your site and enables their integrations. Click any item below to open a corresponding Docs page.'=>'El plugin Procaptcha detecta automáticamente los plugins compatibles de tu sitio y activa sus integraciones. Haz clic en cualquier elemento para abrir su página de documentación.','Note: Inactive plugins, even if compatible, are excluded.'=>'Nota: los plugins inactivos se excluyen aunque sean compatibles.','Your favourite plugin is not listed? %1$s Start a thread %2$s in our support forum and we will consider adding the new integration.'=>'¿No aparece tu plugin favorito? %1$s Abre un tema %2$s en nuestro foro de soporte y estudiaremos añadir la integración.','General'=>'General','Your Secret Key:'=>'Su clave secreta:','Your Site Key:'=>'Su clave del sitio:','Theme:'=>'Tema:','Language:'=>'Idioma:','Require from authorized users:'=>'Requerir de usuarios autorizados:','Dark'=>'Oscuro','Light'=>'Claro','Same as the site'=>'Igual que el sitio','Visitor\'s browser language'=>'Idioma del navegador del visitante','Behavior'=>'Comportamiento','Upgrade to Professional'=>'Pasar a Professional','Spam Filter: blocks disposable and throwaway email addresses'=>'Filtro de spam: bloquea direcciones de correo desechables','VPN, proxy and datacenter filtering'=>'Filtrado de VPN, proxies y centros de datos','Choose your challenge type, plus icon-order and audio challenges'=>'Elige el tipo de desafío, además de desafíos de orden de iconos y de audio','A risk score and block reason for every decision'=>'Puntuación de riesgo y motivo de bloqueo en cada decisión','Up to 1M requests a month and 50 sites'=>'Hasta 1 M de solicitudes al mes y 50 sitios','Email and Discord support, 99.9% uptime'=>'Soporte por correo y Discord, 99,9 % de disponibilidad','Start a 30-day free trial'=>'Prueba gratis 30 días','Procaptcha Settings'=>'Configuración de Procaptcha','Procaptcha'=>'Procaptcha','Settings'=>'Ajustes','Statistics'=>'Estadísticas','Open the Portal'=>'Abrir el portal','Usage and settings for your site key. Manage your account and site settings in the Prosopo portal.'=>'Uso y ajustes de tu clave de sitio. Gestiona tu cuenta y los ajustes del sitio en el portal de Prosopo.','Your Site Key'=>'Tu clave de sitio','Change in the portal'=>'Cambiar en el portal','Your plan lets you choose the challenge type for this site key in the Prosopo portal.'=>'Tu plan te permite elegir el tipo de desafío de esta clave de sitio en el portal de Prosopo.','Procaptcha shows a challenge only to visitors who look like bots, and picks a Proof of Work, image or jigsaw puzzle challenge for them. Choosing a single challenge type is part of the Professional plan.'=>'Procaptcha solo muestra un desafío a los visitantes que parecen bots y elige para ellos un desafío de Proof of Work, de imagen o de rompecabezas. Elegir un único tipo de desafío forma parte del plan Professional.','Challenge type:'=>'Tipo de desafío:','Your Challenges'=>'Tus desafíos','Audio'=>'Audio','Frictionless (challenge only when needed)'=>'Frictionless (desafío solo cuando hace falta)','Icon order'=>'Orden de iconos','Image'=>'Imagen','Proof of Work'=>'Prueba de trabajo','Jigsaw puzzle'=>'Rompecabezas','out of {total} visits checked this month'=>'de {total} visitas comprobadas este mes','Bots stopped this month'=>'Bots detenidos este mes','Checked by your server'=>'Comprobados por tu servidor','On track for about {forecast} of {limit} by the end of the month.'=>'Al ritmo actual, unas {forecast} de {limit} a final de mes.','On track for about {forecast} by the end of the month, over your limit of {limit}.'=>'Al ritmo actual, unas {forecast} a final de mes, por encima de tu límite de {limit}.','Requests this month'=>'Solicitudes este mes','{used} of {limit} requests used'=>'{used} de {limit} solicitudes usadas','Day'=>'Día','Hide the table'=>'Ocultar la tabla','{percent}% of visitors passed the invisible check without a challenge.'=>'El {percent} % de los visitantes superó la comprobación invisible sin desafío.','Visitors who saw nothing to solve'=>'Visitantes que no tuvieron nada que resolver','Requests'=>'Solicitudes','Challenges served'=>'Desafíos mostrados','Your server checks {percent}% of solved captchas.'=>'Tu servidor comprueba el {percent} % de los captchas resueltos.','Setup check'=>'Comprobación de la configuración','Only {percent}% of solved captchas were checked by your server. A form may be accepting submissions without verifying the Procaptcha token, which lets bots skip it.'=>'Tu servidor solo comprobó el {percent} % de los captchas resueltos. Puede que un formulario acepte envíos sin verificar el token de Procaptcha, lo que permite a los bots saltárselo.','How verification works'=>'Cómo funciona la verificación','Show as a table'=>'Ver como tabla','Solved by visitors'=>'Resueltos por los visitantes','Total'=>'Total','Your statistics could not be loaded. Check that the Site Key and Secret Key on the General tab are correct and saved, then try again.'=>'No se han podido cargar tus estadísticas. Comprueba que la clave de sitio y la clave secreta de la pestaña General son correctas y están guardadas, y vuelve a intentarlo.','Successfully loaded at'=>'Cargado exitosamente a las','Loading, please wait.'=>'Cargando, por favor espere.','Refresh now'=>'Actualizar ahora','Try again'=>'Reintentar','View traffic analytics'=>'Ver la analítica de tráfico','Traffic analytics are included on every plan. See the charts in the Prosopo portal.'=>'La analítica de tráfico está incluida en todos los planes. Consulta los gráficos en el portal de Prosopo.','Traffic Analytics'=>'Análisis de tráfico','Audio:'=>'Audio:','Icon order:'=>'Orden de iconos:','Image:'=>'Imagen:','Proof of Work:'=>'Prueba de trabajo:','Jigsaw puzzle:'=>'Rompecabezas:','Monthly Usage'=>'Uso mensual','Total Verification Requests:'=>'Solicitudes totales de verificación:','Please verify that you are human.'=>'Por favor, verifique que es humano.','Frictionless'=>'Sin fricción','Pow'=>'Pow','Save'=>'Guardar','Procaptcha for WordPress'=>'Procaptcha para WordPress','Free, GDPR-compliant CAPTCHA that stops spam bots. No cookies.'=>'CAPTCHA gratuito y conforme al RGPD que frena a los bots de spam. Sin cookies.','Docs'=>'Documentación','Website'=>'Sitio web','Prosopo portal'=>'Portal de Prosopo','Settings successfully saved.'=>'Ajustes guardados con éxito.','Get your free site key'=>'Consigue tu clave de sitio gratis','Sign up for a free Prosopo account.'=>'Crea una cuenta gratuita de Prosopo.','Copy your Site Key and Secret Key from the Prosopo portal.'=>'Copia tu clave de sitio y tu clave secreta desde el portal de Prosopo.','Paste them here, save, and turn on the forms you want to protect.'=>'Pégalas aquí, guarda y activa los formularios que quieras proteger.','Free for 10,000 requests a month. No credit card.'=>'Gratis hasta 10.000 solicitudes al mes. Sin tarjeta de crédito.','Preview: if the credentials are valid, you should be able to complete the captcha below:'=>'Vista previa: Si las credenciales son válidas, debería poder completar el captcha a continuación:','What protects your forms'=>'Qué protege tus formularios','An invisible check: most visitors see nothing to solve, and only visitors who look like bots get a challenge.'=>'Una comprobación invisible: la mayoría de los visitantes no tiene que resolver nada y solo los que parecen bots reciben un desafío.','A hidden honeypot trap, and blocking of known abusive networks.'=>'Una trampa honeypot oculta y el bloqueo de redes abusivas conocidas.','No cookies and no tracking.'=>'Sin cookies y sin rastreo.','All included on the free plan.'=>'Todo incluido en el plan gratuito.','Data processing agreement'=>'Acuerdo de tratamiento de datos','Please setup your keys to see the statistics.'=>'Por favor, configure sus claves para ver las estadísticas.']]; \ No newline at end of file +return ['domain'=>'prosopo-procaptcha','plural-forms'=>NULL,'language'=>'','project-id-version'=>'Prosopo ProCaptcha 1.0.0','pot-creation-date'=>'2026-10-27T13:57:59+00:00','po-revision-date'=>'YEAR-MO-DA HO:MI+ZONE','x-generator'=>'WP-CLI 2.11.0','messages'=>['Prosopo Procaptcha'=>'Prosopo Procaptcha','Free, GDPR-compliant CAPTCHA that stops spam bots on WordPress core forms and 21 form plugins, page builders and themes. No cookies.'=>'CAPTCHA gratuito y conforme al RGPD que frena a los bots de spam en los formularios principales de WordPress y en 21 plugins de formularios, maquetadores y temas. Sin cookies.','Prosopo Team'=>'Equipo de Prosopo','https://prosopo.io/'=>'https://prosopo.io/','Enable form protection for this forum (new topic, reply)'=>'Habilitar protección de formulario para este foro (nuevo tema, respuesta)','Procaptcha protection'=>'Protección de Procaptcha','Disabled'=>'Desactivado','Enabled'=>'Activado','Enable Procaptcha form protection'=>'Activar la protección de formularios de Procaptcha','WooCommerce'=>'WooCommerce','Protect the checkout form'=>'Proteger el formulario de pago','Protect the order tracking form'=>'Proteger el formulario de seguimiento de pedidos','Core Forms'=>'Formularios principales','Protect the comment form:'=>'Proteger el formulario de comentarios:','Protect the login form:'=>'Proteger el formulario de inicio de sesión:','Protect the lost password form:'=>'Proteger el formulario de contraseña olvidada:','Protect the post/page password form:'=>'Proteger el formulario de contraseña de publicación/página:','Protect the register form:'=>'Proteger el formulario de registro:','Active Integrations'=>'Integraciones activas','The Procaptcha plugin automatically detects compatible plugins on your site and enables their integrations. Click any item below to open a corresponding Docs page.'=>'El plugin Procaptcha detecta automáticamente los plugins compatibles de tu sitio y activa sus integraciones. Haz clic en cualquier elemento para abrir su página de documentación.','Note: Inactive plugins, even if compatible, are excluded.'=>'Nota: los plugins inactivos se excluyen aunque sean compatibles.','Your favourite plugin is not listed? %1$s Start a thread %2$s in our support forum and we will consider adding the new integration.'=>'¿No aparece tu plugin favorito? %1$s Abre un tema %2$s en nuestro foro de soporte y estudiaremos añadir la integración.','General'=>'General','Your Secret Key:'=>'Su clave secreta:','Your Site Key:'=>'Su clave del sitio:','Theme:'=>'Tema:','Language:'=>'Idioma:','Require from authorized users:'=>'Requerir de usuarios autorizados:','Dark'=>'Oscuro','Light'=>'Claro','Same as the site'=>'Igual que el sitio','Visitor\'s browser language'=>'Idioma del navegador del visitante','Behavior'=>'Comportamiento','Upgrade to Professional'=>'Pasar a Professional','Spam Filter: blocks disposable and throwaway email addresses'=>'Filtro de spam: bloquea direcciones de correo desechables','VPN, proxy and datacenter filtering'=>'Filtrado de VPN, proxies y centros de datos','Choose your challenge type, plus icon-order and audio challenges'=>'Elige el tipo de desafío, además de desafíos de orden de iconos y de audio','A risk score and block reason for every decision'=>'Puntuación de riesgo y motivo de bloqueo en cada decisión','Up to 1M requests a month and 50 sites'=>'Hasta 1 M de solicitudes al mes y 50 sitios','Email and Discord support, 99.9% uptime'=>'Soporte por correo y Discord, 99,9 % de disponibilidad','Start a 30-day free trial'=>'Prueba gratis 30 días','Procaptcha Settings'=>'Configuración de Procaptcha','Procaptcha'=>'Procaptcha','Settings'=>'Ajustes','Statistics'=>'Estadísticas','Open the Portal'=>'Abrir el portal','Usage and settings for your site key. Manage your account and site settings in the Prosopo portal.'=>'Uso y ajustes de tu clave de sitio. Gestiona tu cuenta y los ajustes del sitio en el portal de Prosopo.','Your Site Key'=>'Tu clave de sitio','Change in the portal'=>'Cambiar en el portal','Your plan lets you choose the challenge type for this site key in the Prosopo portal.'=>'Tu plan te permite elegir el tipo de desafío de esta clave de sitio en el portal de Prosopo.','Procaptcha shows a challenge only to visitors who look like bots, and picks a Proof of Work, image or jigsaw puzzle challenge for them. Choosing a single challenge type is part of the Professional plan.'=>'Procaptcha solo muestra un desafío a los visitantes que parecen bots y elige para ellos un desafío de Proof of Work, de imagen o de rompecabezas. Elegir un único tipo de desafío forma parte del plan Professional.','Challenge type:'=>'Tipo de desafío:','Your Challenges'=>'Tus desafíos','Audio'=>'Audio','Frictionless (challenge only when needed)'=>'Frictionless (desafío solo cuando hace falta)','Icon order'=>'Orden de iconos','Image'=>'Imagen','Proof of Work'=>'Prueba de trabajo','Jigsaw puzzle'=>'Rompecabezas','out of {total} visits checked this month'=>'de {total} visitas comprobadas este mes','Bots stopped this month'=>'Bots detenidos este mes','Checked by your server'=>'Comprobados por tu servidor','On track for about {forecast} of {limit} by the end of the month.'=>'Al ritmo actual, unas {forecast} de {limit} a final de mes.','On track for about {forecast} by the end of the month, over your limit of {limit}.'=>'Al ritmo actual, unas {forecast} a final de mes, por encima de tu límite de {limit}.','Requests this month'=>'Solicitudes este mes','{used} of {limit} requests used'=>'{used} de {limit} solicitudes usadas','Day'=>'Día','Hide the table'=>'Ocultar la tabla','{percent}% of visitors passed the invisible check without a challenge.'=>'El {percent} % de los visitantes superó la comprobación invisible sin desafío.','Visitors who saw nothing to solve'=>'Visitantes que no tuvieron nada que resolver','Requests'=>'Solicitudes','Challenges served'=>'Desafíos mostrados','Your server checks {percent}% of solved captchas.'=>'Tu servidor comprueba el {percent} % de los captchas resueltos.','Setup check'=>'Comprobación de la configuración','Only {percent}% of solved captchas were checked by your server. A form may be accepting submissions without verifying the Procaptcha token, which lets bots skip it.'=>'Tu servidor solo comprobó el {percent} % de los captchas resueltos. Puede que un formulario acepte envíos sin verificar el token de Procaptcha, lo que permite a los bots saltárselo.','How verification works'=>'Cómo funciona la verificación','Show as a table'=>'Ver como tabla','Solved by visitors'=>'Resueltos por los visitantes','Total'=>'Total','Your statistics could not be loaded. Check that the Site Key and Secret Key on the General tab are correct and saved, then try again.'=>'No se han podido cargar tus estadísticas. Comprueba que la clave de sitio y la clave secreta de la pestaña General son correctas y están guardadas, y vuelve a intentarlo.','Successfully loaded at'=>'Cargado exitosamente a las','Loading, please wait.'=>'Cargando, por favor espere.','Refresh now'=>'Actualizar ahora','Try again'=>'Reintentar','View traffic analytics'=>'Ver la analítica de tráfico','Traffic analytics are included on every plan. See the charts in the Prosopo portal.'=>'La analítica de tráfico está incluida en todos los planes. Consulta los gráficos en el portal de Prosopo.','Traffic Analytics'=>'Análisis de tráfico','Audio:'=>'Audio:','Icon order:'=>'Orden de iconos:','Image:'=>'Imagen:','Proof of Work:'=>'Prueba de trabajo:','Jigsaw puzzle:'=>'Rompecabezas:','Monthly Usage'=>'Uso mensual','Total Verification Requests:'=>'Solicitudes totales de verificación:','Please verify that you are human.'=>'Por favor, verifique que es humano.','Frictionless'=>'Sin fricción','Pow'=>'Pow','Save'=>'Guardar','Procaptcha for WordPress'=>'Procaptcha para WordPress','Free, GDPR-compliant CAPTCHA that stops spam bots. No cookies.'=>'CAPTCHA gratuito y conforme al RGPD que frena a los bots de spam. Sin cookies.','Docs'=>'Documentación','Website'=>'Sitio web','Prosopo portal'=>'Portal de Prosopo','Settings successfully saved.'=>'Ajustes guardados con éxito.','Get your free site key'=>'Consigue tu clave de sitio gratis','Sign up for a free Prosopo account.'=>'Crea una cuenta gratuita de Prosopo.','Copy your Site Key and Secret Key from the Prosopo portal.'=>'Copia tu clave de sitio y tu clave secreta desde el portal de Prosopo.','Paste them here, save, and turn on the forms you want to protect.'=>'Pégalas aquí, guarda y activa los formularios que quieras proteger.','Free for 10,000 requests a month. No credit card.'=>'Gratis hasta 10.000 solicitudes al mes. Sin tarjeta de crédito.','Preview: if the credentials are valid, you should be able to complete the captcha below:'=>'Vista previa: Si las credenciales son válidas, debería poder completar el captcha a continuación:','What protects your forms'=>'Qué protege tus formularios','An invisible check: most visitors see nothing to solve, and only visitors who look like bots get a challenge.'=>'Una comprobación invisible: la mayoría de los visitantes no tiene que resolver nada y solo los que parecen bots reciben un desafío.','A hidden honeypot trap, and blocking of known abusive networks.'=>'Una trampa honeypot oculta y el bloqueo de redes abusivas conocidas.','No cookies and no tracking.'=>'Sin cookies y sin rastreo.','All included on the free plan.'=>'Todo incluido en el plan gratuito.','Data processing agreement'=>'Acuerdo de tratamiento de datos','Please setup your keys to see the statistics.'=>'Por favor, configure sus claves para ver las estadísticas.','Visitor IP matching:'=>'Coincidencia de IP del visitante:','Off (recommended)'=>'Desactivado (recomendado)','On - site is behind Cloudflare'=>'Activado: el sitio está detrás de Cloudflare','On - visitors connect directly (REMOTE_ADDR)'=>'Activado: los visitantes se conectan directamente (REMOTE_ADDR)','On - site is behind another proxy (X-Forwarded-For)'=>'Activado: el sitio está detrás de otro proxy (X-Forwarded-For)']]; \ No newline at end of file diff --git a/prosopo-procaptcha/lang/prosopo-procaptcha-es_ES.mo b/prosopo-procaptcha/lang/prosopo-procaptcha-es_ES.mo index 8cc60c3..2703663 100644 Binary files a/prosopo-procaptcha/lang/prosopo-procaptcha-es_ES.mo and b/prosopo-procaptcha/lang/prosopo-procaptcha-es_ES.mo differ diff --git a/prosopo-procaptcha/lang/prosopo-procaptcha-es_ES.po b/prosopo-procaptcha/lang/prosopo-procaptcha-es_ES.po index 9e342db..579d3a6 100644 --- a/prosopo-procaptcha/lang/prosopo-procaptcha-es_ES.po +++ b/prosopo-procaptcha/lang/prosopo-procaptcha-es_ES.po @@ -2,19 +2,20 @@ msgid "" msgstr "" "Project-Id-Version: Prosopo ProCaptcha 1.0.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/prosopo-procaptcha\n" -"POT-Creation-Date: 2026-10-27T13:57:59+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" -"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2026-10-27T13:57:59+00:00\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Language: \n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: prosopo-procaptcha\n" #. Plugin Name of the plugin -#: prosopo-procaptcha.php src/Widget/Procaptcha_Widget.php:77 +#: prosopo-procaptcha.php +#: src/Widget/Procaptcha_Widget.php:77 msgid "Prosopo Procaptcha" msgstr "Prosopo Procaptcha" @@ -111,49 +112,49 @@ msgstr "Nota: los plugins inactivos se excluyen aunque sean compatibles." msgid "Your favourite plugin is not listed? %1$s Start a thread %2$s in our support forum and we will consider adding the new integration." msgstr "¿No aparece tu plugin favorito? %1$s Abre un tema %2$s en nuestro foro de soporte y estudiaremos añadir la integración." -#: src/Settings/General/Tab/General_Settings_Tab.php:30 +#: src/Settings/General/Tab/General_Settings_Tab.php:31 msgid "General" msgstr "General" -#: src/Settings/General/Tab/General_Settings_Tab.php:99 +#: src/Settings/General/Tab/General_Settings_Tab.php:114 msgid "Your Secret Key:" msgstr "Su clave secreta:" -#: src/Settings/General/Tab/General_Settings_Tab.php:100 +#: src/Settings/General/Tab/General_Settings_Tab.php:115 msgid "Your Site Key:" msgstr "Su clave del sitio:" -#: src/Settings/General/Tab/General_Settings_Tab.php:101 +#: src/Settings/General/Tab/General_Settings_Tab.php:116 msgid "Theme:" msgstr "Tema:" -#: src/Settings/General/Tab/General_Settings_Tab.php:102 +#: src/Settings/General/Tab/General_Settings_Tab.php:118 msgid "Language:" msgstr "Idioma:" -#: src/Settings/General/Tab/General_Settings_Tab.php:108 +#: src/Settings/General/Tab/General_Settings_Tab.php:124 msgid "Require from authorized users:" msgstr "Requerir de usuarios autorizados:" -#: src/Settings/General/Tab/General_Settings_Tab.php:122 +#: src/Settings/General/Tab/General_Settings_Tab.php:140 #: src/Widget/Procaptcha_Widget.php:55 msgid "Dark" msgstr "Oscuro" -#: src/Settings/General/Tab/General_Settings_Tab.php:123 +#: src/Settings/General/Tab/General_Settings_Tab.php:141 #: src/Widget/Procaptcha_Widget.php:56 msgid "Light" msgstr "Claro" -#: src/Settings/General/Tab/General_Settings_Tab.php:126 +#: src/Settings/General/Tab/General_Settings_Tab.php:151 msgid "Same as the site" msgstr "Igual que el sitio" -#: src/Settings/General/Tab/General_Settings_Tab.php:127 +#: src/Settings/General/Tab/General_Settings_Tab.php:152 msgid "Visitor's browser language" msgstr "Idioma del navegador del visitante" -#: src/Settings/General/Tab/General_Settings_Tab.php:137 +#: src/Settings/General/Tab/General_Settings_Tab.php:162 msgid "Behavior" msgstr "Comportamiento" @@ -494,3 +495,23 @@ msgstr "Acuerdo de tratamiento de datos" #: src/Settings/Statistics/statistics_settings.blade.php:34 msgid "Please setup your keys to see the statistics." msgstr "Por favor, configure sus claves para ver las estadísticas." + +#: src/Settings/General/Tab/General_Settings_Tab.php:117 +msgid "Visitor IP matching:" +msgstr "Coincidencia de IP del visitante:" + +#: src/Settings/General/Tab/General_Settings_Tab.php:145 +msgid "Off (recommended)" +msgstr "Desactivado (recomendado)" + +#: src/Settings/General/Tab/General_Settings_Tab.php:146 +msgid "On - site is behind Cloudflare" +msgstr "Activado: el sitio está detrás de Cloudflare" + +#: src/Settings/General/Tab/General_Settings_Tab.php:147 +msgid "On - visitors connect directly (REMOTE_ADDR)" +msgstr "Activado: los visitantes se conectan directamente (REMOTE_ADDR)" + +#: src/Settings/General/Tab/General_Settings_Tab.php:148 +msgid "On - site is behind another proxy (X-Forwarded-For)" +msgstr "Activado: el sitio está detrás de otro proxy (X-Forwarded-For)" diff --git a/prosopo-procaptcha/lang/prosopo-procaptcha-fr_FR.l10n.php b/prosopo-procaptcha/lang/prosopo-procaptcha-fr_FR.l10n.php index eff1bdf..fd2418d 100644 --- a/prosopo-procaptcha/lang/prosopo-procaptcha-fr_FR.l10n.php +++ b/prosopo-procaptcha/lang/prosopo-procaptcha-fr_FR.l10n.php @@ -1,2 +1,2 @@ 'prosopo-procaptcha','plural-forms'=>NULL,'language'=>'','project-id-version'=>'Prosopo ProCaptcha 1.0.0','pot-creation-date'=>'2026-10-27T13:57:59+00:00','po-revision-date'=>'YEAR-MO-DA HO:MI+ZONE','x-generator'=>'WP-CLI 2.11.0','messages'=>['Prosopo Procaptcha'=>'Prosopo Procaptcha','Free, GDPR-compliant CAPTCHA that stops spam bots on WordPress core forms and 21 form plugins, page builders and themes. No cookies.'=>'CAPTCHA gratuit et conforme au RGPD qui bloque les bots de spam sur les formulaires principaux de WordPress et 21 plugins de formulaires, constructeurs de pages et thèmes. Sans cookies.','Prosopo Team'=>'Équipe Prosopo','https://prosopo.io/'=>'https://prosopo.io/','Enable form protection for this forum (new topic, reply)'=>'Activer la protection de formulaire pour ce forum (nouveau sujet, réponse)','Procaptcha protection'=>'Protection Procaptcha','Disabled'=>'Désactivé','Enabled'=>'Activé','Enable Procaptcha form protection'=>'Activer la protection des formulaires Procaptcha','WooCommerce'=>'WooCommerce','Protect the checkout form'=>'Protéger le formulaire de paiement','Protect the order tracking form'=>'Protéger le formulaire de suivi de commande','Core Forms'=>'Formulaires principaux','Protect the comment form:'=>'Protéger le formulaire de commentaire :','Protect the login form:'=>'Protéger le formulaire de connexion :','Protect the lost password form:'=>'Protéger le formulaire de mot de passe oublié :','Protect the post/page password form:'=>'Protéger le formulaire de mot de passe des articles/pages :','Protect the register form:'=>'Protéger le formulaire d\'inscription :','Active Integrations'=>'Intégrations actives','The Procaptcha plugin automatically detects compatible plugins on your site and enables their integrations. Click any item below to open a corresponding Docs page.'=>'Le plugin Procaptcha détecte automatiquement les plugins compatibles de votre site et active leurs intégrations. Cliquez sur un élément pour ouvrir la page de documentation correspondante.','Note: Inactive plugins, even if compatible, are excluded.'=>'Remarque : les plugins inactifs sont exclus, même s\'ils sont compatibles.','Your favourite plugin is not listed? %1$s Start a thread %2$s in our support forum and we will consider adding the new integration.'=>'Votre plugin préféré n\'est pas dans la liste ? %1$s Ouvrez un sujet %2$s sur notre forum d\'assistance et nous étudierons son intégration.','General'=>'Général','Your Secret Key:'=>'Votre clé secrète :','Your Site Key:'=>'Votre clé de site :','Theme:'=>'Thème :','Language:'=>'Langue :','Require from authorized users:'=>'Exiger des utilisateurs autorisés :','Dark'=>'Sombre','Light'=>'Clair','Same as the site'=>'Identique au site','Visitor\'s browser language'=>'Langue du navigateur du visiteur','Behavior'=>'Comportement','Upgrade to Professional'=>'Passer à Professional','Spam Filter: blocks disposable and throwaway email addresses'=>'Filtre anti-spam : bloque les adresses e-mail jetables','VPN, proxy and datacenter filtering'=>'Filtrage des VPN, proxys et centres de données','Choose your challenge type, plus icon-order and audio challenges'=>'Choisissez le type de défi, plus les défis d\'ordre d\'icônes et audio','A risk score and block reason for every decision'=>'Un score de risque et un motif de blocage pour chaque décision','Up to 1M requests a month and 50 sites'=>'Jusqu\'à 1 M de requêtes par mois et 50 sites','Email and Discord support, 99.9% uptime'=>'Assistance par e-mail et Discord, disponibilité de 99,9 %','Start a 30-day free trial'=>'Essai gratuit de 30 jours','Procaptcha Settings'=>'Paramètres de Procaptcha','Procaptcha'=>'Procaptcha','Settings'=>'Paramètres','Statistics'=>'Statistiques','Open the Portal'=>'Ouvrir le portail','Usage and settings for your site key. Manage your account and site settings in the Prosopo portal.'=>'Utilisation et réglages de votre clé de site. Gérez votre compte et les réglages du site dans le portail Prosopo.','Your Site Key'=>'Votre clé de site','Change in the portal'=>'Modifier dans le portail','Your plan lets you choose the challenge type for this site key in the Prosopo portal.'=>'Votre offre vous permet de choisir le type de défi de cette clé de site dans le portail Prosopo.','Procaptcha shows a challenge only to visitors who look like bots, and picks a Proof of Work, image or jigsaw puzzle challenge for them. Choosing a single challenge type is part of the Professional plan.'=>'Procaptcha n\'affiche un défi qu\'aux visiteurs qui ressemblent à des bots, et choisit pour eux un défi Proof of Work, image ou puzzle. Choisir un seul type de défi fait partie de l\'offre Professional.','Challenge type:'=>'Type de défi :','Your Challenges'=>'Vos défis','Audio'=>'Audio','Frictionless (challenge only when needed)'=>'Frictionless (défi uniquement si nécessaire)','Icon order'=>'Ordre des icônes','Image'=>'Image','Proof of Work'=>'Preuve de travail','Jigsaw puzzle'=>'Puzzle','out of {total} visits checked this month'=>'sur {total} visites vérifiées ce mois-ci','Bots stopped this month'=>'Bots arrêtés ce mois-ci','Checked by your server'=>'Vérifiés par votre serveur','On track for about {forecast} of {limit} by the end of the month.'=>'Au rythme actuel, environ {forecast} sur {limit} d\'ici la fin du mois.','On track for about {forecast} by the end of the month, over your limit of {limit}.'=>'Au rythme actuel, environ {forecast} d\'ici la fin du mois, au-delà de votre limite de {limit}.','Requests this month'=>'Requêtes ce mois-ci','{used} of {limit} requests used'=>'{used} requêtes utilisées sur {limit}','Day'=>'Jour','Hide the table'=>'Masquer le tableau','{percent}% of visitors passed the invisible check without a challenge.'=>'{percent} % des visiteurs ont passé la vérification invisible sans défi.','Visitors who saw nothing to solve'=>'Visiteurs qui n\'ont rien eu à résoudre','Requests'=>'Requêtes','Challenges served'=>'Défis affichés','Your server checks {percent}% of solved captchas.'=>'Votre serveur vérifie {percent} % des captchas résolus.','Setup check'=>'Vérification de la configuration','Only {percent}% of solved captchas were checked by your server. A form may be accepting submissions without verifying the Procaptcha token, which lets bots skip it.'=>'Seuls {percent} % des captchas résolus ont été vérifiés par votre serveur. Un formulaire accepte peut-être des envois sans vérifier le jeton Procaptcha, ce qui permet aux bots de le contourner.','How verification works'=>'Fonctionnement de la vérification','Show as a table'=>'Afficher sous forme de tableau','Solved by visitors'=>'Résolus par les visiteurs','Total'=>'Total','Your statistics could not be loaded. Check that the Site Key and Secret Key on the General tab are correct and saved, then try again.'=>'Impossible de charger vos statistiques. Vérifiez que la clé de site et la clé secrète de l\'onglet Général sont correctes et enregistrées, puis réessayez.','Successfully loaded at'=>'Chargé avec succès à','Loading, please wait.'=>'Chargement en cours, veuillez patienter.','Refresh now'=>'Actualiser maintenant','Try again'=>'Réessayer','View traffic analytics'=>'Voir l\'analyse du trafic','Traffic analytics are included on every plan. See the charts in the Prosopo portal.'=>'L\'analyse du trafic est incluse dans toutes les offres. Consultez les graphiques dans le portail Prosopo.','Traffic Analytics'=>'Analyse du trafic','Audio:'=>'Audio :','Icon order:'=>'Ordre des icônes :','Image:'=>'Image :','Proof of Work:'=>'Preuve de travail :','Jigsaw puzzle:'=>'Puzzle :','Monthly Usage'=>'Utilisation mensuelle','Total Verification Requests:'=>'Total des demandes de vérification :','Please verify that you are human.'=>'Veuillez vérifier que vous êtes un humain.','Frictionless'=>'Sans friction','Pow'=>'Pow','Save'=>'Enregistrer','Procaptcha for WordPress'=>'Procaptcha pour WordPress','Free, GDPR-compliant CAPTCHA that stops spam bots. No cookies.'=>'CAPTCHA gratuit et conforme au RGPD qui bloque les bots de spam. Sans cookies.','Docs'=>'Documentation','Website'=>'Site web','Prosopo portal'=>'Portail Prosopo','Settings successfully saved.'=>'Paramètres enregistrés avec succès.','Get your free site key'=>'Obtenez votre clé de site gratuite','Sign up for a free Prosopo account.'=>'Créez un compte Prosopo gratuit.','Copy your Site Key and Secret Key from the Prosopo portal.'=>'Copiez votre clé de site et votre clé secrète depuis le portail Prosopo.','Paste them here, save, and turn on the forms you want to protect.'=>'Collez-les ici, enregistrez, puis activez les formulaires à protéger.','Free for 10,000 requests a month. No credit card.'=>'Gratuit jusqu\'à 10 000 requêtes par mois. Sans carte bancaire.','Preview: if the credentials are valid, you should be able to complete the captcha below:'=>'Aperçu : Si les identifiants sont valides, vous devriez pouvoir compléter le captcha ci-dessous :','What protects your forms'=>'Ce qui protège vos formulaires','An invisible check: most visitors see nothing to solve, and only visitors who look like bots get a challenge.'=>'Une vérification invisible : la plupart des visiteurs n\'ont rien à résoudre, seuls ceux qui ressemblent à des bots reçoivent un défi.','A hidden honeypot trap, and blocking of known abusive networks.'=>'Un piège honeypot caché et le blocage des réseaux abusifs connus.','No cookies and no tracking.'=>'Pas de cookies ni de pistage.','All included on the free plan.'=>'Tout est inclus dans l\'offre gratuite.','Data processing agreement'=>'Accord de traitement des données','Please setup your keys to see the statistics.'=>'Veuillez configurer vos clés pour voir les statistiques.']]; \ No newline at end of file +return ['domain'=>'prosopo-procaptcha','plural-forms'=>NULL,'language'=>'','project-id-version'=>'Prosopo ProCaptcha 1.0.0','pot-creation-date'=>'2026-10-27T13:57:59+00:00','po-revision-date'=>'YEAR-MO-DA HO:MI+ZONE','x-generator'=>'WP-CLI 2.11.0','messages'=>['Prosopo Procaptcha'=>'Prosopo Procaptcha','Free, GDPR-compliant CAPTCHA that stops spam bots on WordPress core forms and 21 form plugins, page builders and themes. No cookies.'=>'CAPTCHA gratuit et conforme au RGPD qui bloque les bots de spam sur les formulaires principaux de WordPress et 21 plugins de formulaires, constructeurs de pages et thèmes. Sans cookies.','Prosopo Team'=>'Équipe Prosopo','https://prosopo.io/'=>'https://prosopo.io/','Enable form protection for this forum (new topic, reply)'=>'Activer la protection de formulaire pour ce forum (nouveau sujet, réponse)','Procaptcha protection'=>'Protection Procaptcha','Disabled'=>'Désactivé','Enabled'=>'Activé','Enable Procaptcha form protection'=>'Activer la protection des formulaires Procaptcha','WooCommerce'=>'WooCommerce','Protect the checkout form'=>'Protéger le formulaire de paiement','Protect the order tracking form'=>'Protéger le formulaire de suivi de commande','Core Forms'=>'Formulaires principaux','Protect the comment form:'=>'Protéger le formulaire de commentaire :','Protect the login form:'=>'Protéger le formulaire de connexion :','Protect the lost password form:'=>'Protéger le formulaire de mot de passe oublié :','Protect the post/page password form:'=>'Protéger le formulaire de mot de passe des articles/pages :','Protect the register form:'=>'Protéger le formulaire d\'inscription :','Active Integrations'=>'Intégrations actives','The Procaptcha plugin automatically detects compatible plugins on your site and enables their integrations. Click any item below to open a corresponding Docs page.'=>'Le plugin Procaptcha détecte automatiquement les plugins compatibles de votre site et active leurs intégrations. Cliquez sur un élément pour ouvrir la page de documentation correspondante.','Note: Inactive plugins, even if compatible, are excluded.'=>'Remarque : les plugins inactifs sont exclus, même s\'ils sont compatibles.','Your favourite plugin is not listed? %1$s Start a thread %2$s in our support forum and we will consider adding the new integration.'=>'Votre plugin préféré n\'est pas dans la liste ? %1$s Ouvrez un sujet %2$s sur notre forum d\'assistance et nous étudierons son intégration.','General'=>'Général','Your Secret Key:'=>'Votre clé secrète :','Your Site Key:'=>'Votre clé de site :','Theme:'=>'Thème :','Language:'=>'Langue :','Require from authorized users:'=>'Exiger des utilisateurs autorisés :','Dark'=>'Sombre','Light'=>'Clair','Same as the site'=>'Identique au site','Visitor\'s browser language'=>'Langue du navigateur du visiteur','Behavior'=>'Comportement','Upgrade to Professional'=>'Passer à Professional','Spam Filter: blocks disposable and throwaway email addresses'=>'Filtre anti-spam : bloque les adresses e-mail jetables','VPN, proxy and datacenter filtering'=>'Filtrage des VPN, proxys et centres de données','Choose your challenge type, plus icon-order and audio challenges'=>'Choisissez le type de défi, plus les défis d\'ordre d\'icônes et audio','A risk score and block reason for every decision'=>'Un score de risque et un motif de blocage pour chaque décision','Up to 1M requests a month and 50 sites'=>'Jusqu\'à 1 M de requêtes par mois et 50 sites','Email and Discord support, 99.9% uptime'=>'Assistance par e-mail et Discord, disponibilité de 99,9 %','Start a 30-day free trial'=>'Essai gratuit de 30 jours','Procaptcha Settings'=>'Paramètres de Procaptcha','Procaptcha'=>'Procaptcha','Settings'=>'Paramètres','Statistics'=>'Statistiques','Open the Portal'=>'Ouvrir le portail','Usage and settings for your site key. Manage your account and site settings in the Prosopo portal.'=>'Utilisation et réglages de votre clé de site. Gérez votre compte et les réglages du site dans le portail Prosopo.','Your Site Key'=>'Votre clé de site','Change in the portal'=>'Modifier dans le portail','Your plan lets you choose the challenge type for this site key in the Prosopo portal.'=>'Votre offre vous permet de choisir le type de défi de cette clé de site dans le portail Prosopo.','Procaptcha shows a challenge only to visitors who look like bots, and picks a Proof of Work, image or jigsaw puzzle challenge for them. Choosing a single challenge type is part of the Professional plan.'=>'Procaptcha n\'affiche un défi qu\'aux visiteurs qui ressemblent à des bots, et choisit pour eux un défi Proof of Work, image ou puzzle. Choisir un seul type de défi fait partie de l\'offre Professional.','Challenge type:'=>'Type de défi :','Your Challenges'=>'Vos défis','Audio'=>'Audio','Frictionless (challenge only when needed)'=>'Frictionless (défi uniquement si nécessaire)','Icon order'=>'Ordre des icônes','Image'=>'Image','Proof of Work'=>'Preuve de travail','Jigsaw puzzle'=>'Puzzle','out of {total} visits checked this month'=>'sur {total} visites vérifiées ce mois-ci','Bots stopped this month'=>'Bots arrêtés ce mois-ci','Checked by your server'=>'Vérifiés par votre serveur','On track for about {forecast} of {limit} by the end of the month.'=>'Au rythme actuel, environ {forecast} sur {limit} d\'ici la fin du mois.','On track for about {forecast} by the end of the month, over your limit of {limit}.'=>'Au rythme actuel, environ {forecast} d\'ici la fin du mois, au-delà de votre limite de {limit}.','Requests this month'=>'Requêtes ce mois-ci','{used} of {limit} requests used'=>'{used} requêtes utilisées sur {limit}','Day'=>'Jour','Hide the table'=>'Masquer le tableau','{percent}% of visitors passed the invisible check without a challenge.'=>'{percent} % des visiteurs ont passé la vérification invisible sans défi.','Visitors who saw nothing to solve'=>'Visiteurs qui n\'ont rien eu à résoudre','Requests'=>'Requêtes','Challenges served'=>'Défis affichés','Your server checks {percent}% of solved captchas.'=>'Votre serveur vérifie {percent} % des captchas résolus.','Setup check'=>'Vérification de la configuration','Only {percent}% of solved captchas were checked by your server. A form may be accepting submissions without verifying the Procaptcha token, which lets bots skip it.'=>'Seuls {percent} % des captchas résolus ont été vérifiés par votre serveur. Un formulaire accepte peut-être des envois sans vérifier le jeton Procaptcha, ce qui permet aux bots de le contourner.','How verification works'=>'Fonctionnement de la vérification','Show as a table'=>'Afficher sous forme de tableau','Solved by visitors'=>'Résolus par les visiteurs','Total'=>'Total','Your statistics could not be loaded. Check that the Site Key and Secret Key on the General tab are correct and saved, then try again.'=>'Impossible de charger vos statistiques. Vérifiez que la clé de site et la clé secrète de l\'onglet Général sont correctes et enregistrées, puis réessayez.','Successfully loaded at'=>'Chargé avec succès à','Loading, please wait.'=>'Chargement en cours, veuillez patienter.','Refresh now'=>'Actualiser maintenant','Try again'=>'Réessayer','View traffic analytics'=>'Voir l\'analyse du trafic','Traffic analytics are included on every plan. See the charts in the Prosopo portal.'=>'L\'analyse du trafic est incluse dans toutes les offres. Consultez les graphiques dans le portail Prosopo.','Traffic Analytics'=>'Analyse du trafic','Audio:'=>'Audio :','Icon order:'=>'Ordre des icônes :','Image:'=>'Image :','Proof of Work:'=>'Preuve de travail :','Jigsaw puzzle:'=>'Puzzle :','Monthly Usage'=>'Utilisation mensuelle','Total Verification Requests:'=>'Total des demandes de vérification :','Please verify that you are human.'=>'Veuillez vérifier que vous êtes un humain.','Frictionless'=>'Sans friction','Pow'=>'Pow','Save'=>'Enregistrer','Procaptcha for WordPress'=>'Procaptcha pour WordPress','Free, GDPR-compliant CAPTCHA that stops spam bots. No cookies.'=>'CAPTCHA gratuit et conforme au RGPD qui bloque les bots de spam. Sans cookies.','Docs'=>'Documentation','Website'=>'Site web','Prosopo portal'=>'Portail Prosopo','Settings successfully saved.'=>'Paramètres enregistrés avec succès.','Get your free site key'=>'Obtenez votre clé de site gratuite','Sign up for a free Prosopo account.'=>'Créez un compte Prosopo gratuit.','Copy your Site Key and Secret Key from the Prosopo portal.'=>'Copiez votre clé de site et votre clé secrète depuis le portail Prosopo.','Paste them here, save, and turn on the forms you want to protect.'=>'Collez-les ici, enregistrez, puis activez les formulaires à protéger.','Free for 10,000 requests a month. No credit card.'=>'Gratuit jusqu\'à 10 000 requêtes par mois. Sans carte bancaire.','Preview: if the credentials are valid, you should be able to complete the captcha below:'=>'Aperçu : Si les identifiants sont valides, vous devriez pouvoir compléter le captcha ci-dessous :','What protects your forms'=>'Ce qui protège vos formulaires','An invisible check: most visitors see nothing to solve, and only visitors who look like bots get a challenge.'=>'Une vérification invisible : la plupart des visiteurs n\'ont rien à résoudre, seuls ceux qui ressemblent à des bots reçoivent un défi.','A hidden honeypot trap, and blocking of known abusive networks.'=>'Un piège honeypot caché et le blocage des réseaux abusifs connus.','No cookies and no tracking.'=>'Pas de cookies ni de pistage.','All included on the free plan.'=>'Tout est inclus dans l\'offre gratuite.','Data processing agreement'=>'Accord de traitement des données','Please setup your keys to see the statistics.'=>'Veuillez configurer vos clés pour voir les statistiques.','Visitor IP matching:'=>'Correspondance de l\'IP du visiteur :','Off (recommended)'=>'Désactivé (recommandé)','On - site is behind Cloudflare'=>'Activé – le site est derrière Cloudflare','On - visitors connect directly (REMOTE_ADDR)'=>'Activé – les visiteurs se connectent directement (REMOTE_ADDR)','On - site is behind another proxy (X-Forwarded-For)'=>'Activé – le site est derrière un autre proxy (X-Forwarded-For)']]; \ No newline at end of file diff --git a/prosopo-procaptcha/lang/prosopo-procaptcha-fr_FR.mo b/prosopo-procaptcha/lang/prosopo-procaptcha-fr_FR.mo index 27eeab8..498b701 100644 Binary files a/prosopo-procaptcha/lang/prosopo-procaptcha-fr_FR.mo and b/prosopo-procaptcha/lang/prosopo-procaptcha-fr_FR.mo differ diff --git a/prosopo-procaptcha/lang/prosopo-procaptcha-fr_FR.po b/prosopo-procaptcha/lang/prosopo-procaptcha-fr_FR.po index 2e56050..6881ba5 100644 --- a/prosopo-procaptcha/lang/prosopo-procaptcha-fr_FR.po +++ b/prosopo-procaptcha/lang/prosopo-procaptcha-fr_FR.po @@ -2,19 +2,20 @@ msgid "" msgstr "" "Project-Id-Version: Prosopo ProCaptcha 1.0.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/prosopo-procaptcha\n" -"POT-Creation-Date: 2026-10-27T13:57:59+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" -"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2026-10-27T13:57:59+00:00\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Language: \n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: prosopo-procaptcha\n" #. Plugin Name of the plugin -#: prosopo-procaptcha.php src/Widget/Procaptcha_Widget.php:77 +#: prosopo-procaptcha.php +#: src/Widget/Procaptcha_Widget.php:77 msgid "Prosopo Procaptcha" msgstr "Prosopo Procaptcha" @@ -111,49 +112,49 @@ msgstr "Remarque : les plugins inactifs sont exclus, même s'ils sont compatible msgid "Your favourite plugin is not listed? %1$s Start a thread %2$s in our support forum and we will consider adding the new integration." msgstr "Votre plugin préféré n'est pas dans la liste ? %1$s Ouvrez un sujet %2$s sur notre forum d'assistance et nous étudierons son intégration." -#: src/Settings/General/Tab/General_Settings_Tab.php:30 +#: src/Settings/General/Tab/General_Settings_Tab.php:31 msgid "General" msgstr "Général" -#: src/Settings/General/Tab/General_Settings_Tab.php:99 +#: src/Settings/General/Tab/General_Settings_Tab.php:114 msgid "Your Secret Key:" msgstr "Votre clé secrète :" -#: src/Settings/General/Tab/General_Settings_Tab.php:100 +#: src/Settings/General/Tab/General_Settings_Tab.php:115 msgid "Your Site Key:" msgstr "Votre clé de site :" -#: src/Settings/General/Tab/General_Settings_Tab.php:101 +#: src/Settings/General/Tab/General_Settings_Tab.php:116 msgid "Theme:" msgstr "Thème :" -#: src/Settings/General/Tab/General_Settings_Tab.php:102 +#: src/Settings/General/Tab/General_Settings_Tab.php:118 msgid "Language:" msgstr "Langue :" -#: src/Settings/General/Tab/General_Settings_Tab.php:108 +#: src/Settings/General/Tab/General_Settings_Tab.php:124 msgid "Require from authorized users:" msgstr "Exiger des utilisateurs autorisés :" -#: src/Settings/General/Tab/General_Settings_Tab.php:122 +#: src/Settings/General/Tab/General_Settings_Tab.php:140 #: src/Widget/Procaptcha_Widget.php:55 msgid "Dark" msgstr "Sombre" -#: src/Settings/General/Tab/General_Settings_Tab.php:123 +#: src/Settings/General/Tab/General_Settings_Tab.php:141 #: src/Widget/Procaptcha_Widget.php:56 msgid "Light" msgstr "Clair" -#: src/Settings/General/Tab/General_Settings_Tab.php:126 +#: src/Settings/General/Tab/General_Settings_Tab.php:151 msgid "Same as the site" msgstr "Identique au site" -#: src/Settings/General/Tab/General_Settings_Tab.php:127 +#: src/Settings/General/Tab/General_Settings_Tab.php:152 msgid "Visitor's browser language" msgstr "Langue du navigateur du visiteur" -#: src/Settings/General/Tab/General_Settings_Tab.php:137 +#: src/Settings/General/Tab/General_Settings_Tab.php:162 msgid "Behavior" msgstr "Comportement" @@ -494,3 +495,23 @@ msgstr "Accord de traitement des données" #: src/Settings/Statistics/statistics_settings.blade.php:34 msgid "Please setup your keys to see the statistics." msgstr "Veuillez configurer vos clés pour voir les statistiques." + +#: src/Settings/General/Tab/General_Settings_Tab.php:117 +msgid "Visitor IP matching:" +msgstr "Correspondance de l'IP du visiteur :" + +#: src/Settings/General/Tab/General_Settings_Tab.php:145 +msgid "Off (recommended)" +msgstr "Désactivé (recommandé)" + +#: src/Settings/General/Tab/General_Settings_Tab.php:146 +msgid "On - site is behind Cloudflare" +msgstr "Activé – le site est derrière Cloudflare" + +#: src/Settings/General/Tab/General_Settings_Tab.php:147 +msgid "On - visitors connect directly (REMOTE_ADDR)" +msgstr "Activé – les visiteurs se connectent directement (REMOTE_ADDR)" + +#: src/Settings/General/Tab/General_Settings_Tab.php:148 +msgid "On - site is behind another proxy (X-Forwarded-For)" +msgstr "Activé – le site est derrière un autre proxy (X-Forwarded-For)" diff --git a/prosopo-procaptcha/lang/prosopo-procaptcha-it_IT.l10n.php b/prosopo-procaptcha/lang/prosopo-procaptcha-it_IT.l10n.php index 845464f..d75d908 100644 --- a/prosopo-procaptcha/lang/prosopo-procaptcha-it_IT.l10n.php +++ b/prosopo-procaptcha/lang/prosopo-procaptcha-it_IT.l10n.php @@ -1,2 +1,2 @@ 'prosopo-procaptcha','plural-forms'=>NULL,'language'=>'','project-id-version'=>'Prosopo ProCaptcha 1.0.0','pot-creation-date'=>'2026-10-27T13:57:59+00:00','po-revision-date'=>'YEAR-MO-DA HO:MI+ZONE','x-generator'=>'WP-CLI 2.11.0','messages'=>['Prosopo Procaptcha'=>'Prosopo Procaptcha','Free, GDPR-compliant CAPTCHA that stops spam bots on WordPress core forms and 21 form plugins, page builders and themes. No cookies.'=>'CAPTCHA gratuito e conforme al GDPR che ferma i bot di spam sui moduli principali di WordPress e su 21 plugin di moduli, page builder e temi. Senza cookie.','Prosopo Team'=>'Team Prosopo','https://prosopo.io/'=>'https://prosopo.io/','Enable form protection for this forum (new topic, reply)'=>'Abilita la protezione del modulo per questo forum (nuovo argomento, risposta)','Procaptcha protection'=>'Protezione Procaptcha','Disabled'=>'Disattivato','Enabled'=>'Attivato','Enable Procaptcha form protection'=>'Attiva la protezione dei moduli Procaptcha','WooCommerce'=>'WooCommerce','Protect the checkout form'=>'Proteggi il modulo di pagamento','Protect the order tracking form'=>'Proteggi il modulo di tracciamento degli ordini','Core Forms'=>'Moduli principali','Protect the comment form:'=>'Proteggi il modulo dei commenti:','Protect the login form:'=>'Proteggi il modulo di accesso:','Protect the lost password form:'=>'Proteggi il modulo per il recupero della password:','Protect the post/page password form:'=>'Proteggi il modulo per la password di post/pagina:','Protect the register form:'=>'Proteggi il modulo di registrazione:','Active Integrations'=>'Integrazioni attive','The Procaptcha plugin automatically detects compatible plugins on your site and enables their integrations. Click any item below to open a corresponding Docs page.'=>'Il plugin Procaptcha rileva automaticamente i plugin compatibili sul tuo sito e ne attiva le integrazioni. Fai clic su una voce per aprire la pagina della documentazione corrispondente.','Note: Inactive plugins, even if compatible, are excluded.'=>'Nota: i plugin inattivi sono esclusi, anche se compatibili.','Your favourite plugin is not listed? %1$s Start a thread %2$s in our support forum and we will consider adding the new integration.'=>'Il tuo plugin preferito non è nell\'elenco? %1$s Apri una discussione %2$s nel nostro forum di supporto e valuteremo la nuova integrazione.','General'=>'Generale','Your Secret Key:'=>'La tua chiave segreta:','Your Site Key:'=>'La tua chiave del sito:','Theme:'=>'Tema:','Language:'=>'Lingua:','Require from authorized users:'=>'Richiedi agli utenti autorizzati:','Dark'=>'Scuro','Light'=>'Chiaro','Same as the site'=>'Uguale al sito','Visitor\'s browser language'=>'Lingua del browser del visitatore','Behavior'=>'Comportamento','Upgrade to Professional'=>'Passa a Professional','Spam Filter: blocks disposable and throwaway email addresses'=>'Filtro antispam: blocca gli indirizzi email usa e getta','VPN, proxy and datacenter filtering'=>'Filtro di VPN, proxy e data center','Choose your challenge type, plus icon-order and audio challenges'=>'Scegli il tipo di sfida, oltre alle sfide con ordine delle icone e audio','A risk score and block reason for every decision'=>'Punteggio di rischio e motivo del blocco per ogni decisione','Up to 1M requests a month and 50 sites'=>'Fino a 1 milione di richieste al mese e 50 siti','Email and Discord support, 99.9% uptime'=>'Supporto via email e Discord, disponibilità del 99,9%','Start a 30-day free trial'=>'Prova gratuita di 30 giorni','Procaptcha Settings'=>'Impostazioni di Procaptcha','Procaptcha'=>'Procaptcha','Settings'=>'Impostazioni','Statistics'=>'Statistiche','Open the Portal'=>'Apri il portale','Usage and settings for your site key. Manage your account and site settings in the Prosopo portal.'=>'Utilizzo e impostazioni della tua chiave del sito. Gestisci account e impostazioni del sito nel portale Prosopo.','Your Site Key'=>'La tua chiave del sito','Change in the portal'=>'Modifica nel portale','Your plan lets you choose the challenge type for this site key in the Prosopo portal.'=>'Il tuo piano ti permette di scegliere il tipo di sfida per questa chiave del sito nel portale Prosopo.','Procaptcha shows a challenge only to visitors who look like bots, and picks a Proof of Work, image or jigsaw puzzle challenge for them. Choosing a single challenge type is part of the Professional plan.'=>'Procaptcha mostra una sfida solo ai visitatori che sembrano bot e sceglie per loro una sfida Proof of Work, con immagini o puzzle. La scelta di un unico tipo di sfida fa parte del piano Professional.','Challenge type:'=>'Tipo di sfida:','Your Challenges'=>'Le tue sfide','Audio'=>'Audio','Frictionless (challenge only when needed)'=>'Frictionless (sfida solo quando serve)','Icon order'=>'Ordine delle icone','Image'=>'Immagine','Proof of Work'=>'Prova di lavoro','Jigsaw puzzle'=>'Puzzle','out of {total} visits checked this month'=>'su {total} visite controllate questo mese','Bots stopped this month'=>'Bot fermati questo mese','Checked by your server'=>'Controllati dal tuo server','On track for about {forecast} of {limit} by the end of the month.'=>'Di questo passo, circa {forecast} su {limit} entro fine mese.','On track for about {forecast} by the end of the month, over your limit of {limit}.'=>'Di questo passo, circa {forecast} entro fine mese, oltre il tuo limite di {limit}.','Requests this month'=>'Richieste questo mese','{used} of {limit} requests used'=>'{used} di {limit} richieste usate','Day'=>'Giorno','Hide the table'=>'Nascondi la tabella','{percent}% of visitors passed the invisible check without a challenge.'=>'Il {percent}% dei visitatori ha superato il controllo invisibile senza sfida.','Visitors who saw nothing to solve'=>'Visitatori senza nulla da risolvere','Requests'=>'Richieste','Challenges served'=>'Sfide mostrate','Your server checks {percent}% of solved captchas.'=>'Il tuo server controlla il {percent}% dei captcha risolti.','Setup check'=>'Controllo della configurazione','Only {percent}% of solved captchas were checked by your server. A form may be accepting submissions without verifying the Procaptcha token, which lets bots skip it.'=>'Solo il {percent}% dei captcha risolti è stato controllato dal tuo server. Un modulo potrebbe accettare invii senza verificare il token Procaptcha, permettendo ai bot di aggirarlo.','How verification works'=>'Come funziona la verifica','Show as a table'=>'Mostra come tabella','Solved by visitors'=>'Risolti dai visitatori','Total'=>'Totale','Your statistics could not be loaded. Check that the Site Key and Secret Key on the General tab are correct and saved, then try again.'=>'Non è stato possibile caricare le statistiche. Controlla che la chiave del sito e la chiave segreta nella scheda Generale siano corrette e salvate, poi riprova.','Successfully loaded at'=>'Caricato con successo alle','Loading, please wait.'=>'Caricamento in corso, attendere.','Refresh now'=>'Aggiorna ora','Try again'=>'Riprova','View traffic analytics'=>'Visualizza l\'analisi del traffico','Traffic analytics are included on every plan. See the charts in the Prosopo portal.'=>'L\'analisi del traffico è inclusa in ogni piano. Consulta i grafici nel portale Prosopo.','Traffic Analytics'=>'Analisi del traffico','Audio:'=>'Audio:','Icon order:'=>'Ordine delle icone:','Image:'=>'Immagine:','Proof of Work:'=>'Prova di lavoro:','Jigsaw puzzle:'=>'Puzzle:','Monthly Usage'=>'Utilizzo mensile','Total Verification Requests:'=>'Richieste totali di verifica:','Please verify that you are human.'=>'Si prega di verificare che siate umani.','Frictionless'=>'Senza attrito','Pow'=>'Pow','Save'=>'Salva','Procaptcha for WordPress'=>'Procaptcha per WordPress','Free, GDPR-compliant CAPTCHA that stops spam bots. No cookies.'=>'CAPTCHA gratuito e conforme al GDPR che ferma i bot di spam. Senza cookie.','Docs'=>'Documentazione','Website'=>'Sito web','Prosopo portal'=>'Portale Prosopo','Settings successfully saved.'=>'Impostazioni salvate con successo.','Get your free site key'=>'Ottieni la tua chiave del sito gratuita','Sign up for a free Prosopo account.'=>'Crea un account Prosopo gratuito.','Copy your Site Key and Secret Key from the Prosopo portal.'=>'Copia la chiave del sito e la chiave segreta dal portale Prosopo.','Paste them here, save, and turn on the forms you want to protect.'=>'Incollale qui, salva e attiva i moduli che vuoi proteggere.','Free for 10,000 requests a month. No credit card.'=>'Gratis fino a 10.000 richieste al mese. Nessuna carta di credito.','Preview: if the credentials are valid, you should be able to complete the captcha below:'=>'Anteprima: se le credenziali sono valide, dovresti essere in grado di completare il captcha qui sotto:','What protects your forms'=>'Cosa protegge i tuoi moduli','An invisible check: most visitors see nothing to solve, and only visitors who look like bots get a challenge.'=>'Un controllo invisibile: la maggior parte dei visitatori non deve risolvere nulla e solo chi sembra un bot riceve una sfida.','A hidden honeypot trap, and blocking of known abusive networks.'=>'Una trappola honeypot nascosta e il blocco delle reti abusive note.','No cookies and no tracking.'=>'Nessun cookie e nessun tracciamento.','All included on the free plan.'=>'Tutto incluso nel piano gratuito.','Data processing agreement'=>'Accordo sul trattamento dei dati','Please setup your keys to see the statistics.'=>'Configura le tue chiavi per vedere le statistiche.']]; \ No newline at end of file +return ['domain'=>'prosopo-procaptcha','plural-forms'=>NULL,'language'=>'','project-id-version'=>'Prosopo ProCaptcha 1.0.0','pot-creation-date'=>'2026-10-27T13:57:59+00:00','po-revision-date'=>'YEAR-MO-DA HO:MI+ZONE','x-generator'=>'WP-CLI 2.11.0','messages'=>['Prosopo Procaptcha'=>'Prosopo Procaptcha','Free, GDPR-compliant CAPTCHA that stops spam bots on WordPress core forms and 21 form plugins, page builders and themes. No cookies.'=>'CAPTCHA gratuito e conforme al GDPR che ferma i bot di spam sui moduli principali di WordPress e su 21 plugin di moduli, page builder e temi. Senza cookie.','Prosopo Team'=>'Team Prosopo','https://prosopo.io/'=>'https://prosopo.io/','Enable form protection for this forum (new topic, reply)'=>'Abilita la protezione del modulo per questo forum (nuovo argomento, risposta)','Procaptcha protection'=>'Protezione Procaptcha','Disabled'=>'Disattivato','Enabled'=>'Attivato','Enable Procaptcha form protection'=>'Attiva la protezione dei moduli Procaptcha','WooCommerce'=>'WooCommerce','Protect the checkout form'=>'Proteggi il modulo di pagamento','Protect the order tracking form'=>'Proteggi il modulo di tracciamento degli ordini','Core Forms'=>'Moduli principali','Protect the comment form:'=>'Proteggi il modulo dei commenti:','Protect the login form:'=>'Proteggi il modulo di accesso:','Protect the lost password form:'=>'Proteggi il modulo per il recupero della password:','Protect the post/page password form:'=>'Proteggi il modulo per la password di post/pagina:','Protect the register form:'=>'Proteggi il modulo di registrazione:','Active Integrations'=>'Integrazioni attive','The Procaptcha plugin automatically detects compatible plugins on your site and enables their integrations. Click any item below to open a corresponding Docs page.'=>'Il plugin Procaptcha rileva automaticamente i plugin compatibili sul tuo sito e ne attiva le integrazioni. Fai clic su una voce per aprire la pagina della documentazione corrispondente.','Note: Inactive plugins, even if compatible, are excluded.'=>'Nota: i plugin inattivi sono esclusi, anche se compatibili.','Your favourite plugin is not listed? %1$s Start a thread %2$s in our support forum and we will consider adding the new integration.'=>'Il tuo plugin preferito non è nell\'elenco? %1$s Apri una discussione %2$s nel nostro forum di supporto e valuteremo la nuova integrazione.','General'=>'Generale','Your Secret Key:'=>'La tua chiave segreta:','Your Site Key:'=>'La tua chiave del sito:','Theme:'=>'Tema:','Language:'=>'Lingua:','Require from authorized users:'=>'Richiedi agli utenti autorizzati:','Dark'=>'Scuro','Light'=>'Chiaro','Same as the site'=>'Uguale al sito','Visitor\'s browser language'=>'Lingua del browser del visitatore','Behavior'=>'Comportamento','Upgrade to Professional'=>'Passa a Professional','Spam Filter: blocks disposable and throwaway email addresses'=>'Filtro antispam: blocca gli indirizzi email usa e getta','VPN, proxy and datacenter filtering'=>'Filtro di VPN, proxy e data center','Choose your challenge type, plus icon-order and audio challenges'=>'Scegli il tipo di sfida, oltre alle sfide con ordine delle icone e audio','A risk score and block reason for every decision'=>'Punteggio di rischio e motivo del blocco per ogni decisione','Up to 1M requests a month and 50 sites'=>'Fino a 1 milione di richieste al mese e 50 siti','Email and Discord support, 99.9% uptime'=>'Supporto via email e Discord, disponibilità del 99,9%','Start a 30-day free trial'=>'Prova gratuita di 30 giorni','Procaptcha Settings'=>'Impostazioni di Procaptcha','Procaptcha'=>'Procaptcha','Settings'=>'Impostazioni','Statistics'=>'Statistiche','Open the Portal'=>'Apri il portale','Usage and settings for your site key. Manage your account and site settings in the Prosopo portal.'=>'Utilizzo e impostazioni della tua chiave del sito. Gestisci account e impostazioni del sito nel portale Prosopo.','Your Site Key'=>'La tua chiave del sito','Change in the portal'=>'Modifica nel portale','Your plan lets you choose the challenge type for this site key in the Prosopo portal.'=>'Il tuo piano ti permette di scegliere il tipo di sfida per questa chiave del sito nel portale Prosopo.','Procaptcha shows a challenge only to visitors who look like bots, and picks a Proof of Work, image or jigsaw puzzle challenge for them. Choosing a single challenge type is part of the Professional plan.'=>'Procaptcha mostra una sfida solo ai visitatori che sembrano bot e sceglie per loro una sfida Proof of Work, con immagini o puzzle. La scelta di un unico tipo di sfida fa parte del piano Professional.','Challenge type:'=>'Tipo di sfida:','Your Challenges'=>'Le tue sfide','Audio'=>'Audio','Frictionless (challenge only when needed)'=>'Frictionless (sfida solo quando serve)','Icon order'=>'Ordine delle icone','Image'=>'Immagine','Proof of Work'=>'Prova di lavoro','Jigsaw puzzle'=>'Puzzle','out of {total} visits checked this month'=>'su {total} visite controllate questo mese','Bots stopped this month'=>'Bot fermati questo mese','Checked by your server'=>'Controllati dal tuo server','On track for about {forecast} of {limit} by the end of the month.'=>'Di questo passo, circa {forecast} su {limit} entro fine mese.','On track for about {forecast} by the end of the month, over your limit of {limit}.'=>'Di questo passo, circa {forecast} entro fine mese, oltre il tuo limite di {limit}.','Requests this month'=>'Richieste questo mese','{used} of {limit} requests used'=>'{used} di {limit} richieste usate','Day'=>'Giorno','Hide the table'=>'Nascondi la tabella','{percent}% of visitors passed the invisible check without a challenge.'=>'Il {percent}% dei visitatori ha superato il controllo invisibile senza sfida.','Visitors who saw nothing to solve'=>'Visitatori senza nulla da risolvere','Requests'=>'Richieste','Challenges served'=>'Sfide mostrate','Your server checks {percent}% of solved captchas.'=>'Il tuo server controlla il {percent}% dei captcha risolti.','Setup check'=>'Controllo della configurazione','Only {percent}% of solved captchas were checked by your server. A form may be accepting submissions without verifying the Procaptcha token, which lets bots skip it.'=>'Solo il {percent}% dei captcha risolti è stato controllato dal tuo server. Un modulo potrebbe accettare invii senza verificare il token Procaptcha, permettendo ai bot di aggirarlo.','How verification works'=>'Come funziona la verifica','Show as a table'=>'Mostra come tabella','Solved by visitors'=>'Risolti dai visitatori','Total'=>'Totale','Your statistics could not be loaded. Check that the Site Key and Secret Key on the General tab are correct and saved, then try again.'=>'Non è stato possibile caricare le statistiche. Controlla che la chiave del sito e la chiave segreta nella scheda Generale siano corrette e salvate, poi riprova.','Successfully loaded at'=>'Caricato con successo alle','Loading, please wait.'=>'Caricamento in corso, attendere.','Refresh now'=>'Aggiorna ora','Try again'=>'Riprova','View traffic analytics'=>'Visualizza l\'analisi del traffico','Traffic analytics are included on every plan. See the charts in the Prosopo portal.'=>'L\'analisi del traffico è inclusa in ogni piano. Consulta i grafici nel portale Prosopo.','Traffic Analytics'=>'Analisi del traffico','Audio:'=>'Audio:','Icon order:'=>'Ordine delle icone:','Image:'=>'Immagine:','Proof of Work:'=>'Prova di lavoro:','Jigsaw puzzle:'=>'Puzzle:','Monthly Usage'=>'Utilizzo mensile','Total Verification Requests:'=>'Richieste totali di verifica:','Please verify that you are human.'=>'Si prega di verificare che siate umani.','Frictionless'=>'Senza attrito','Pow'=>'Pow','Save'=>'Salva','Procaptcha for WordPress'=>'Procaptcha per WordPress','Free, GDPR-compliant CAPTCHA that stops spam bots. No cookies.'=>'CAPTCHA gratuito e conforme al GDPR che ferma i bot di spam. Senza cookie.','Docs'=>'Documentazione','Website'=>'Sito web','Prosopo portal'=>'Portale Prosopo','Settings successfully saved.'=>'Impostazioni salvate con successo.','Get your free site key'=>'Ottieni la tua chiave del sito gratuita','Sign up for a free Prosopo account.'=>'Crea un account Prosopo gratuito.','Copy your Site Key and Secret Key from the Prosopo portal.'=>'Copia la chiave del sito e la chiave segreta dal portale Prosopo.','Paste them here, save, and turn on the forms you want to protect.'=>'Incollale qui, salva e attiva i moduli che vuoi proteggere.','Free for 10,000 requests a month. No credit card.'=>'Gratis fino a 10.000 richieste al mese. Nessuna carta di credito.','Preview: if the credentials are valid, you should be able to complete the captcha below:'=>'Anteprima: se le credenziali sono valide, dovresti essere in grado di completare il captcha qui sotto:','What protects your forms'=>'Cosa protegge i tuoi moduli','An invisible check: most visitors see nothing to solve, and only visitors who look like bots get a challenge.'=>'Un controllo invisibile: la maggior parte dei visitatori non deve risolvere nulla e solo chi sembra un bot riceve una sfida.','A hidden honeypot trap, and blocking of known abusive networks.'=>'Una trappola honeypot nascosta e il blocco delle reti abusive note.','No cookies and no tracking.'=>'Nessun cookie e nessun tracciamento.','All included on the free plan.'=>'Tutto incluso nel piano gratuito.','Data processing agreement'=>'Accordo sul trattamento dei dati','Please setup your keys to see the statistics.'=>'Configura le tue chiavi per vedere le statistiche.','Visitor IP matching:'=>'Corrispondenza IP del visitatore:','Off (recommended)'=>'Disattivato (consigliato)','On - site is behind Cloudflare'=>'Attivato – il sito è dietro Cloudflare','On - visitors connect directly (REMOTE_ADDR)'=>'Attivato – i visitatori si connettono direttamente (REMOTE_ADDR)','On - site is behind another proxy (X-Forwarded-For)'=>'Attivato – il sito è dietro un altro proxy (X-Forwarded-For)']]; \ No newline at end of file diff --git a/prosopo-procaptcha/lang/prosopo-procaptcha-it_IT.mo b/prosopo-procaptcha/lang/prosopo-procaptcha-it_IT.mo index 0187c9a..4bf1349 100644 Binary files a/prosopo-procaptcha/lang/prosopo-procaptcha-it_IT.mo and b/prosopo-procaptcha/lang/prosopo-procaptcha-it_IT.mo differ diff --git a/prosopo-procaptcha/lang/prosopo-procaptcha-it_IT.po b/prosopo-procaptcha/lang/prosopo-procaptcha-it_IT.po index dbfafe4..0feeb6a 100644 --- a/prosopo-procaptcha/lang/prosopo-procaptcha-it_IT.po +++ b/prosopo-procaptcha/lang/prosopo-procaptcha-it_IT.po @@ -2,19 +2,20 @@ msgid "" msgstr "" "Project-Id-Version: Prosopo ProCaptcha 1.0.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/prosopo-procaptcha\n" -"POT-Creation-Date: 2026-10-27T13:57:59+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" -"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2026-10-27T13:57:59+00:00\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Language: \n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: prosopo-procaptcha\n" #. Plugin Name of the plugin -#: prosopo-procaptcha.php src/Widget/Procaptcha_Widget.php:77 +#: prosopo-procaptcha.php +#: src/Widget/Procaptcha_Widget.php:77 msgid "Prosopo Procaptcha" msgstr "Prosopo Procaptcha" @@ -111,49 +112,49 @@ msgstr "Nota: i plugin inattivi sono esclusi, anche se compatibili." msgid "Your favourite plugin is not listed? %1$s Start a thread %2$s in our support forum and we will consider adding the new integration." msgstr "Il tuo plugin preferito non è nell'elenco? %1$s Apri una discussione %2$s nel nostro forum di supporto e valuteremo la nuova integrazione." -#: src/Settings/General/Tab/General_Settings_Tab.php:30 +#: src/Settings/General/Tab/General_Settings_Tab.php:31 msgid "General" msgstr "Generale" -#: src/Settings/General/Tab/General_Settings_Tab.php:99 +#: src/Settings/General/Tab/General_Settings_Tab.php:114 msgid "Your Secret Key:" msgstr "La tua chiave segreta:" -#: src/Settings/General/Tab/General_Settings_Tab.php:100 +#: src/Settings/General/Tab/General_Settings_Tab.php:115 msgid "Your Site Key:" msgstr "La tua chiave del sito:" -#: src/Settings/General/Tab/General_Settings_Tab.php:101 +#: src/Settings/General/Tab/General_Settings_Tab.php:116 msgid "Theme:" msgstr "Tema:" -#: src/Settings/General/Tab/General_Settings_Tab.php:102 +#: src/Settings/General/Tab/General_Settings_Tab.php:118 msgid "Language:" msgstr "Lingua:" -#: src/Settings/General/Tab/General_Settings_Tab.php:108 +#: src/Settings/General/Tab/General_Settings_Tab.php:124 msgid "Require from authorized users:" msgstr "Richiedi agli utenti autorizzati:" -#: src/Settings/General/Tab/General_Settings_Tab.php:122 +#: src/Settings/General/Tab/General_Settings_Tab.php:140 #: src/Widget/Procaptcha_Widget.php:55 msgid "Dark" msgstr "Scuro" -#: src/Settings/General/Tab/General_Settings_Tab.php:123 +#: src/Settings/General/Tab/General_Settings_Tab.php:141 #: src/Widget/Procaptcha_Widget.php:56 msgid "Light" msgstr "Chiaro" -#: src/Settings/General/Tab/General_Settings_Tab.php:126 +#: src/Settings/General/Tab/General_Settings_Tab.php:151 msgid "Same as the site" msgstr "Uguale al sito" -#: src/Settings/General/Tab/General_Settings_Tab.php:127 +#: src/Settings/General/Tab/General_Settings_Tab.php:152 msgid "Visitor's browser language" msgstr "Lingua del browser del visitatore" -#: src/Settings/General/Tab/General_Settings_Tab.php:137 +#: src/Settings/General/Tab/General_Settings_Tab.php:162 msgid "Behavior" msgstr "Comportamento" @@ -494,3 +495,23 @@ msgstr "Accordo sul trattamento dei dati" #: src/Settings/Statistics/statistics_settings.blade.php:34 msgid "Please setup your keys to see the statistics." msgstr "Configura le tue chiavi per vedere le statistiche." + +#: src/Settings/General/Tab/General_Settings_Tab.php:117 +msgid "Visitor IP matching:" +msgstr "Corrispondenza IP del visitatore:" + +#: src/Settings/General/Tab/General_Settings_Tab.php:145 +msgid "Off (recommended)" +msgstr "Disattivato (consigliato)" + +#: src/Settings/General/Tab/General_Settings_Tab.php:146 +msgid "On - site is behind Cloudflare" +msgstr "Attivato – il sito è dietro Cloudflare" + +#: src/Settings/General/Tab/General_Settings_Tab.php:147 +msgid "On - visitors connect directly (REMOTE_ADDR)" +msgstr "Attivato – i visitatori si connettono direttamente (REMOTE_ADDR)" + +#: src/Settings/General/Tab/General_Settings_Tab.php:148 +msgid "On - site is behind another proxy (X-Forwarded-For)" +msgstr "Attivato – il sito è dietro un altro proxy (X-Forwarded-For)" diff --git a/prosopo-procaptcha/lang/prosopo-procaptcha-pt_PT.l10n.php b/prosopo-procaptcha/lang/prosopo-procaptcha-pt_PT.l10n.php index 69536b0..4283ea1 100644 --- a/prosopo-procaptcha/lang/prosopo-procaptcha-pt_PT.l10n.php +++ b/prosopo-procaptcha/lang/prosopo-procaptcha-pt_PT.l10n.php @@ -1,2 +1,2 @@ 'prosopo-procaptcha','plural-forms'=>NULL,'language'=>'','project-id-version'=>'Prosopo ProCaptcha 1.0.0','pot-creation-date'=>'2026-10-27T13:57:59+00:00','po-revision-date'=>'YEAR-MO-DA HO:MI+ZONE','x-generator'=>'WP-CLI 2.11.0','messages'=>['Prosopo Procaptcha'=>'Prosopo Procaptcha','Free, GDPR-compliant CAPTCHA that stops spam bots on WordPress core forms and 21 form plugins, page builders and themes. No cookies.'=>'CAPTCHA gratuito e em conformidade com o RGPD que trava os bots de spam nos formulários principais do WordPress e em 21 plugins de formulários, construtores de páginas e temas. Sem cookies.','Prosopo Team'=>'Equipe Prosopo','https://prosopo.io/'=>'https://prosopo.io/','Enable form protection for this forum (new topic, reply)'=>'Ativar a proteção de formulário para este fórum (novo tópico, resposta)','Procaptcha protection'=>'Proteção Procaptcha','Disabled'=>'Desativado','Enabled'=>'Ativado','Enable Procaptcha form protection'=>'Ativar a proteção de formulários Procaptcha','WooCommerce'=>'WooCommerce','Protect the checkout form'=>'Proteger o formulário de checkout','Protect the order tracking form'=>'Proteger o formulário de rastreamento de pedidos','Core Forms'=>'Formulários principais','Protect the comment form:'=>'Proteger o formulário de comentários:','Protect the login form:'=>'Proteger o formulário de login:','Protect the lost password form:'=>'Proteger o formulário de recuperação de senha:','Protect the post/page password form:'=>'Proteger o formulário de senha de postagem/página:','Protect the register form:'=>'Proteger o formulário de registro:','Active Integrations'=>'Integrações ativas','The Procaptcha plugin automatically detects compatible plugins on your site and enables their integrations. Click any item below to open a corresponding Docs page.'=>'O plugin Procaptcha deteta automaticamente os plugins compatíveis no seu site e ativa as respetivas integrações. Clique num item para abrir a página de documentação correspondente.','Note: Inactive plugins, even if compatible, are excluded.'=>'Nota: os plugins inativos são excluídos, mesmo que sejam compatíveis.','Your favourite plugin is not listed? %1$s Start a thread %2$s in our support forum and we will consider adding the new integration.'=>'O seu plugin preferido não está na lista? %1$s Abra um tópico %2$s no nosso fórum de suporte e iremos considerar a nova integração.','General'=>'Geral','Your Secret Key:'=>'Sua chave secreta:','Your Site Key:'=>'Sua chave do site:','Theme:'=>'Tema:','Language:'=>'Idioma:','Require from authorized users:'=>'Exigir de usuários autorizados:','Dark'=>'Escuro','Light'=>'Claro','Same as the site'=>'Igual ao site','Visitor\'s browser language'=>'Idioma do navegador do visitante','Behavior'=>'Comportamento','Upgrade to Professional'=>'Mudar para Professional','Spam Filter: blocks disposable and throwaway email addresses'=>'Filtro de spam: bloqueia endereços de email descartáveis','VPN, proxy and datacenter filtering'=>'Filtragem de VPN, proxies e centros de dados','Choose your challenge type, plus icon-order and audio challenges'=>'Escolha o tipo de desafio, mais desafios de ordem de ícones e de áudio','A risk score and block reason for every decision'=>'Pontuação de risco e motivo de bloqueio em cada decisão','Up to 1M requests a month and 50 sites'=>'Até 1 milhão de pedidos por mês e 50 sites','Email and Discord support, 99.9% uptime'=>'Suporte por email e Discord, 99,9% de disponibilidade','Start a 30-day free trial'=>'Experimente grátis durante 30 dias','Procaptcha Settings'=>'Configurações do Procaptcha','Procaptcha'=>'Procaptcha','Settings'=>'Configurações','Statistics'=>'Estatísticas','Open the Portal'=>'Abrir o portal','Usage and settings for your site key. Manage your account and site settings in the Prosopo portal.'=>'Utilização e definições da sua chave do site. Gira a sua conta e as definições do site no portal Prosopo.','Your Site Key'=>'A sua chave do site','Change in the portal'=>'Alterar no portal','Your plan lets you choose the challenge type for this site key in the Prosopo portal.'=>'O seu plano permite escolher o tipo de desafio desta chave do site no portal Prosopo.','Procaptcha shows a challenge only to visitors who look like bots, and picks a Proof of Work, image or jigsaw puzzle challenge for them. Choosing a single challenge type is part of the Professional plan.'=>'O Procaptcha só mostra um desafio aos visitantes que parecem bots e escolhe para eles um desafio Proof of Work, de imagem ou de puzzle. Escolher um único tipo de desafio faz parte do plano Professional.','Challenge type:'=>'Tipo de desafio:','Your Challenges'=>'Os seus desafios','Audio'=>'Áudio','Frictionless (challenge only when needed)'=>'Frictionless (desafio apenas quando necessário)','Icon order'=>'Ordem dos ícones','Image'=>'Imagem','Proof of Work'=>'Prova de trabalho','Jigsaw puzzle'=>'Puzzle','out of {total} visits checked this month'=>'de {total} visitas verificadas este mês','Bots stopped this month'=>'Bots travados este mês','Checked by your server'=>'Verificados pelo seu servidor','On track for about {forecast} of {limit} by the end of the month.'=>'Ao ritmo atual, cerca de {forecast} de {limit} até ao fim do mês.','On track for about {forecast} by the end of the month, over your limit of {limit}.'=>'Ao ritmo atual, cerca de {forecast} até ao fim do mês, acima do seu limite de {limit}.','Requests this month'=>'Pedidos este mês','{used} of {limit} requests used'=>'{used} de {limit} pedidos usados','Day'=>'Dia','Hide the table'=>'Ocultar a tabela','{percent}% of visitors passed the invisible check without a challenge.'=>'{percent}% dos visitantes passaram a verificação invisível sem desafio.','Visitors who saw nothing to solve'=>'Visitantes sem nada para resolver','Requests'=>'Pedidos','Challenges served'=>'Desafios apresentados','Your server checks {percent}% of solved captchas.'=>'O seu servidor verifica {percent}% dos captchas resolvidos.','Setup check'=>'Verificação da configuração','Only {percent}% of solved captchas were checked by your server. A form may be accepting submissions without verifying the Procaptcha token, which lets bots skip it.'=>'Apenas {percent}% dos captchas resolvidos foram verificados pelo seu servidor. Um formulário pode estar a aceitar envios sem verificar o token do Procaptcha, o que permite aos bots contorná-lo.','How verification works'=>'Como funciona a verificação','Show as a table'=>'Mostrar como tabela','Solved by visitors'=>'Resolvidos pelos visitantes','Total'=>'Total','Your statistics could not be loaded. Check that the Site Key and Secret Key on the General tab are correct and saved, then try again.'=>'Não foi possível carregar as suas estatísticas. Verifique se a chave do site e a chave secreta no separador Geral estão corretas e guardadas e tente novamente.','Successfully loaded at'=>'Carregado com sucesso em','Loading, please wait.'=>'Carregando, por favor aguarde.','Refresh now'=>'Atualizar agora','Try again'=>'Tentar novamente','View traffic analytics'=>'Ver a análise de tráfego','Traffic analytics are included on every plan. See the charts in the Prosopo portal.'=>'A análise de tráfego está incluída em todos os planos. Consulte os gráficos no portal Prosopo.','Traffic Analytics'=>'Análise de tráfego','Audio:'=>'Áudio:','Icon order:'=>'Ordem dos ícones:','Image:'=>'Imagem:','Proof of Work:'=>'Prova de trabalho:','Jigsaw puzzle:'=>'Puzzle:','Monthly Usage'=>'Uso mensal','Total Verification Requests:'=>'Total de solicitações de verificação:','Please verify that you are human.'=>'Por favor, verifique que você é humano.','Frictionless'=>'Sem fricção','Pow'=>'Pow','Save'=>'Salvar','Procaptcha for WordPress'=>'Procaptcha para WordPress','Free, GDPR-compliant CAPTCHA that stops spam bots. No cookies.'=>'CAPTCHA gratuito e em conformidade com o RGPD que trava os bots de spam. Sem cookies.','Docs'=>'Documentação','Website'=>'Site','Prosopo portal'=>'Portal Prosopo','Settings successfully saved.'=>'Configurações salvas com sucesso.','Get your free site key'=>'Obtenha a sua chave do site gratuita','Sign up for a free Prosopo account.'=>'Crie uma conta Prosopo gratuita.','Copy your Site Key and Secret Key from the Prosopo portal.'=>'Copie a chave do site e a chave secreta a partir do portal Prosopo.','Paste them here, save, and turn on the forms you want to protect.'=>'Cole-as aqui, guarde e ative os formulários que pretende proteger.','Free for 10,000 requests a month. No credit card.'=>'Grátis até 10 000 pedidos por mês. Sem cartão de crédito.','Preview: if the credentials are valid, you should be able to complete the captcha below:'=>'Pré-visualização: se as credenciais forem válidas, você deverá conseguir completar o captcha abaixo:','What protects your forms'=>'O que protege os seus formulários','An invisible check: most visitors see nothing to solve, and only visitors who look like bots get a challenge.'=>'Uma verificação invisível: a maioria dos visitantes não tem nada para resolver e só quem parece um bot recebe um desafio.','A hidden honeypot trap, and blocking of known abusive networks.'=>'Uma armadilha honeypot oculta e o bloqueio de redes abusivas conhecidas.','No cookies and no tracking.'=>'Sem cookies e sem rastreio.','All included on the free plan.'=>'Tudo incluído no plano gratuito.','Data processing agreement'=>'Acordo de tratamento de dados','Please setup your keys to see the statistics.'=>'Configure suas chaves para ver as estatísticas.']]; \ No newline at end of file +return ['domain'=>'prosopo-procaptcha','plural-forms'=>NULL,'language'=>'','project-id-version'=>'Prosopo ProCaptcha 1.0.0','pot-creation-date'=>'2026-10-27T13:57:59+00:00','po-revision-date'=>'YEAR-MO-DA HO:MI+ZONE','x-generator'=>'WP-CLI 2.11.0','messages'=>['Prosopo Procaptcha'=>'Prosopo Procaptcha','Free, GDPR-compliant CAPTCHA that stops spam bots on WordPress core forms and 21 form plugins, page builders and themes. No cookies.'=>'CAPTCHA gratuito e em conformidade com o RGPD que trava os bots de spam nos formulários principais do WordPress e em 21 plugins de formulários, construtores de páginas e temas. Sem cookies.','Prosopo Team'=>'Equipe Prosopo','https://prosopo.io/'=>'https://prosopo.io/','Enable form protection for this forum (new topic, reply)'=>'Ativar a proteção de formulário para este fórum (novo tópico, resposta)','Procaptcha protection'=>'Proteção Procaptcha','Disabled'=>'Desativado','Enabled'=>'Ativado','Enable Procaptcha form protection'=>'Ativar a proteção de formulários Procaptcha','WooCommerce'=>'WooCommerce','Protect the checkout form'=>'Proteger o formulário de checkout','Protect the order tracking form'=>'Proteger o formulário de rastreamento de pedidos','Core Forms'=>'Formulários principais','Protect the comment form:'=>'Proteger o formulário de comentários:','Protect the login form:'=>'Proteger o formulário de login:','Protect the lost password form:'=>'Proteger o formulário de recuperação de senha:','Protect the post/page password form:'=>'Proteger o formulário de senha de postagem/página:','Protect the register form:'=>'Proteger o formulário de registro:','Active Integrations'=>'Integrações ativas','The Procaptcha plugin automatically detects compatible plugins on your site and enables their integrations. Click any item below to open a corresponding Docs page.'=>'O plugin Procaptcha deteta automaticamente os plugins compatíveis no seu site e ativa as respetivas integrações. Clique num item para abrir a página de documentação correspondente.','Note: Inactive plugins, even if compatible, are excluded.'=>'Nota: os plugins inativos são excluídos, mesmo que sejam compatíveis.','Your favourite plugin is not listed? %1$s Start a thread %2$s in our support forum and we will consider adding the new integration.'=>'O seu plugin preferido não está na lista? %1$s Abra um tópico %2$s no nosso fórum de suporte e iremos considerar a nova integração.','General'=>'Geral','Your Secret Key:'=>'Sua chave secreta:','Your Site Key:'=>'Sua chave do site:','Theme:'=>'Tema:','Language:'=>'Idioma:','Require from authorized users:'=>'Exigir de usuários autorizados:','Dark'=>'Escuro','Light'=>'Claro','Same as the site'=>'Igual ao site','Visitor\'s browser language'=>'Idioma do navegador do visitante','Behavior'=>'Comportamento','Upgrade to Professional'=>'Mudar para Professional','Spam Filter: blocks disposable and throwaway email addresses'=>'Filtro de spam: bloqueia endereços de email descartáveis','VPN, proxy and datacenter filtering'=>'Filtragem de VPN, proxies e centros de dados','Choose your challenge type, plus icon-order and audio challenges'=>'Escolha o tipo de desafio, mais desafios de ordem de ícones e de áudio','A risk score and block reason for every decision'=>'Pontuação de risco e motivo de bloqueio em cada decisão','Up to 1M requests a month and 50 sites'=>'Até 1 milhão de pedidos por mês e 50 sites','Email and Discord support, 99.9% uptime'=>'Suporte por email e Discord, 99,9% de disponibilidade','Start a 30-day free trial'=>'Experimente grátis durante 30 dias','Procaptcha Settings'=>'Configurações do Procaptcha','Procaptcha'=>'Procaptcha','Settings'=>'Configurações','Statistics'=>'Estatísticas','Open the Portal'=>'Abrir o portal','Usage and settings for your site key. Manage your account and site settings in the Prosopo portal.'=>'Utilização e definições da sua chave do site. Gira a sua conta e as definições do site no portal Prosopo.','Your Site Key'=>'A sua chave do site','Change in the portal'=>'Alterar no portal','Your plan lets you choose the challenge type for this site key in the Prosopo portal.'=>'O seu plano permite escolher o tipo de desafio desta chave do site no portal Prosopo.','Procaptcha shows a challenge only to visitors who look like bots, and picks a Proof of Work, image or jigsaw puzzle challenge for them. Choosing a single challenge type is part of the Professional plan.'=>'O Procaptcha só mostra um desafio aos visitantes que parecem bots e escolhe para eles um desafio Proof of Work, de imagem ou de puzzle. Escolher um único tipo de desafio faz parte do plano Professional.','Challenge type:'=>'Tipo de desafio:','Your Challenges'=>'Os seus desafios','Audio'=>'Áudio','Frictionless (challenge only when needed)'=>'Frictionless (desafio apenas quando necessário)','Icon order'=>'Ordem dos ícones','Image'=>'Imagem','Proof of Work'=>'Prova de trabalho','Jigsaw puzzle'=>'Puzzle','out of {total} visits checked this month'=>'de {total} visitas verificadas este mês','Bots stopped this month'=>'Bots travados este mês','Checked by your server'=>'Verificados pelo seu servidor','On track for about {forecast} of {limit} by the end of the month.'=>'Ao ritmo atual, cerca de {forecast} de {limit} até ao fim do mês.','On track for about {forecast} by the end of the month, over your limit of {limit}.'=>'Ao ritmo atual, cerca de {forecast} até ao fim do mês, acima do seu limite de {limit}.','Requests this month'=>'Pedidos este mês','{used} of {limit} requests used'=>'{used} de {limit} pedidos usados','Day'=>'Dia','Hide the table'=>'Ocultar a tabela','{percent}% of visitors passed the invisible check without a challenge.'=>'{percent}% dos visitantes passaram a verificação invisível sem desafio.','Visitors who saw nothing to solve'=>'Visitantes sem nada para resolver','Requests'=>'Pedidos','Challenges served'=>'Desafios apresentados','Your server checks {percent}% of solved captchas.'=>'O seu servidor verifica {percent}% dos captchas resolvidos.','Setup check'=>'Verificação da configuração','Only {percent}% of solved captchas were checked by your server. A form may be accepting submissions without verifying the Procaptcha token, which lets bots skip it.'=>'Apenas {percent}% dos captchas resolvidos foram verificados pelo seu servidor. Um formulário pode estar a aceitar envios sem verificar o token do Procaptcha, o que permite aos bots contorná-lo.','How verification works'=>'Como funciona a verificação','Show as a table'=>'Mostrar como tabela','Solved by visitors'=>'Resolvidos pelos visitantes','Total'=>'Total','Your statistics could not be loaded. Check that the Site Key and Secret Key on the General tab are correct and saved, then try again.'=>'Não foi possível carregar as suas estatísticas. Verifique se a chave do site e a chave secreta no separador Geral estão corretas e guardadas e tente novamente.','Successfully loaded at'=>'Carregado com sucesso em','Loading, please wait.'=>'Carregando, por favor aguarde.','Refresh now'=>'Atualizar agora','Try again'=>'Tentar novamente','View traffic analytics'=>'Ver a análise de tráfego','Traffic analytics are included on every plan. See the charts in the Prosopo portal.'=>'A análise de tráfego está incluída em todos os planos. Consulte os gráficos no portal Prosopo.','Traffic Analytics'=>'Análise de tráfego','Audio:'=>'Áudio:','Icon order:'=>'Ordem dos ícones:','Image:'=>'Imagem:','Proof of Work:'=>'Prova de trabalho:','Jigsaw puzzle:'=>'Puzzle:','Monthly Usage'=>'Uso mensal','Total Verification Requests:'=>'Total de solicitações de verificação:','Please verify that you are human.'=>'Por favor, verifique que você é humano.','Frictionless'=>'Sem fricção','Pow'=>'Pow','Save'=>'Salvar','Procaptcha for WordPress'=>'Procaptcha para WordPress','Free, GDPR-compliant CAPTCHA that stops spam bots. No cookies.'=>'CAPTCHA gratuito e em conformidade com o RGPD que trava os bots de spam. Sem cookies.','Docs'=>'Documentação','Website'=>'Site','Prosopo portal'=>'Portal Prosopo','Settings successfully saved.'=>'Configurações salvas com sucesso.','Get your free site key'=>'Obtenha a sua chave do site gratuita','Sign up for a free Prosopo account.'=>'Crie uma conta Prosopo gratuita.','Copy your Site Key and Secret Key from the Prosopo portal.'=>'Copie a chave do site e a chave secreta a partir do portal Prosopo.','Paste them here, save, and turn on the forms you want to protect.'=>'Cole-as aqui, guarde e ative os formulários que pretende proteger.','Free for 10,000 requests a month. No credit card.'=>'Grátis até 10 000 pedidos por mês. Sem cartão de crédito.','Preview: if the credentials are valid, you should be able to complete the captcha below:'=>'Pré-visualização: se as credenciais forem válidas, você deverá conseguir completar o captcha abaixo:','What protects your forms'=>'O que protege os seus formulários','An invisible check: most visitors see nothing to solve, and only visitors who look like bots get a challenge.'=>'Uma verificação invisível: a maioria dos visitantes não tem nada para resolver e só quem parece um bot recebe um desafio.','A hidden honeypot trap, and blocking of known abusive networks.'=>'Uma armadilha honeypot oculta e o bloqueio de redes abusivas conhecidas.','No cookies and no tracking.'=>'Sem cookies e sem rastreio.','All included on the free plan.'=>'Tudo incluído no plano gratuito.','Data processing agreement'=>'Acordo de tratamento de dados','Please setup your keys to see the statistics.'=>'Configure suas chaves para ver as estatísticas.','Visitor IP matching:'=>'Correspondência do IP do visitante:','Off (recommended)'=>'Desativado (recomendado)','On - site is behind Cloudflare'=>'Ativado – o site está atrás do Cloudflare','On - visitors connect directly (REMOTE_ADDR)'=>'Ativado – os visitantes ligam-se diretamente (REMOTE_ADDR)','On - site is behind another proxy (X-Forwarded-For)'=>'Ativado – o site está atrás de outro proxy (X-Forwarded-For)']]; \ No newline at end of file diff --git a/prosopo-procaptcha/lang/prosopo-procaptcha-pt_PT.mo b/prosopo-procaptcha/lang/prosopo-procaptcha-pt_PT.mo index 4080aed..32e502e 100644 Binary files a/prosopo-procaptcha/lang/prosopo-procaptcha-pt_PT.mo and b/prosopo-procaptcha/lang/prosopo-procaptcha-pt_PT.mo differ diff --git a/prosopo-procaptcha/lang/prosopo-procaptcha-pt_PT.po b/prosopo-procaptcha/lang/prosopo-procaptcha-pt_PT.po index 324c588..783acf6 100644 --- a/prosopo-procaptcha/lang/prosopo-procaptcha-pt_PT.po +++ b/prosopo-procaptcha/lang/prosopo-procaptcha-pt_PT.po @@ -2,19 +2,20 @@ msgid "" msgstr "" "Project-Id-Version: Prosopo ProCaptcha 1.0.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/prosopo-procaptcha\n" -"POT-Creation-Date: 2026-10-27T13:57:59+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" -"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2026-10-27T13:57:59+00:00\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Language: \n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: prosopo-procaptcha\n" #. Plugin Name of the plugin -#: prosopo-procaptcha.php src/Widget/Procaptcha_Widget.php:77 +#: prosopo-procaptcha.php +#: src/Widget/Procaptcha_Widget.php:77 msgid "Prosopo Procaptcha" msgstr "Prosopo Procaptcha" @@ -111,49 +112,49 @@ msgstr "Nota: os plugins inativos são excluídos, mesmo que sejam compatíveis. msgid "Your favourite plugin is not listed? %1$s Start a thread %2$s in our support forum and we will consider adding the new integration." msgstr "O seu plugin preferido não está na lista? %1$s Abra um tópico %2$s no nosso fórum de suporte e iremos considerar a nova integração." -#: src/Settings/General/Tab/General_Settings_Tab.php:30 +#: src/Settings/General/Tab/General_Settings_Tab.php:31 msgid "General" msgstr "Geral" -#: src/Settings/General/Tab/General_Settings_Tab.php:99 +#: src/Settings/General/Tab/General_Settings_Tab.php:114 msgid "Your Secret Key:" msgstr "Sua chave secreta:" -#: src/Settings/General/Tab/General_Settings_Tab.php:100 +#: src/Settings/General/Tab/General_Settings_Tab.php:115 msgid "Your Site Key:" msgstr "Sua chave do site:" -#: src/Settings/General/Tab/General_Settings_Tab.php:101 +#: src/Settings/General/Tab/General_Settings_Tab.php:116 msgid "Theme:" msgstr "Tema:" -#: src/Settings/General/Tab/General_Settings_Tab.php:102 +#: src/Settings/General/Tab/General_Settings_Tab.php:118 msgid "Language:" msgstr "Idioma:" -#: src/Settings/General/Tab/General_Settings_Tab.php:108 +#: src/Settings/General/Tab/General_Settings_Tab.php:124 msgid "Require from authorized users:" msgstr "Exigir de usuários autorizados:" -#: src/Settings/General/Tab/General_Settings_Tab.php:122 +#: src/Settings/General/Tab/General_Settings_Tab.php:140 #: src/Widget/Procaptcha_Widget.php:55 msgid "Dark" msgstr "Escuro" -#: src/Settings/General/Tab/General_Settings_Tab.php:123 +#: src/Settings/General/Tab/General_Settings_Tab.php:141 #: src/Widget/Procaptcha_Widget.php:56 msgid "Light" msgstr "Claro" -#: src/Settings/General/Tab/General_Settings_Tab.php:126 +#: src/Settings/General/Tab/General_Settings_Tab.php:151 msgid "Same as the site" msgstr "Igual ao site" -#: src/Settings/General/Tab/General_Settings_Tab.php:127 +#: src/Settings/General/Tab/General_Settings_Tab.php:152 msgid "Visitor's browser language" msgstr "Idioma do navegador do visitante" -#: src/Settings/General/Tab/General_Settings_Tab.php:137 +#: src/Settings/General/Tab/General_Settings_Tab.php:162 msgid "Behavior" msgstr "Comportamento" @@ -494,3 +495,23 @@ msgstr "Acordo de tratamento de dados" #: src/Settings/Statistics/statistics_settings.blade.php:34 msgid "Please setup your keys to see the statistics." msgstr "Configure suas chaves para ver as estatísticas." + +#: src/Settings/General/Tab/General_Settings_Tab.php:117 +msgid "Visitor IP matching:" +msgstr "Correspondência do IP do visitante:" + +#: src/Settings/General/Tab/General_Settings_Tab.php:145 +msgid "Off (recommended)" +msgstr "Desativado (recomendado)" + +#: src/Settings/General/Tab/General_Settings_Tab.php:146 +msgid "On - site is behind Cloudflare" +msgstr "Ativado – o site está atrás do Cloudflare" + +#: src/Settings/General/Tab/General_Settings_Tab.php:147 +msgid "On - visitors connect directly (REMOTE_ADDR)" +msgstr "Ativado – os visitantes ligam-se diretamente (REMOTE_ADDR)" + +#: src/Settings/General/Tab/General_Settings_Tab.php:148 +msgid "On - site is behind another proxy (X-Forwarded-For)" +msgstr "Ativado – o site está atrás de outro proxy (X-Forwarded-For)" diff --git a/prosopo-procaptcha/lang/prosopo-procaptcha.pot b/prosopo-procaptcha/lang/prosopo-procaptcha.pot index 181f4a7..dfb19fe 100644 --- a/prosopo-procaptcha/lang/prosopo-procaptcha.pot +++ b/prosopo-procaptcha/lang/prosopo-procaptcha.pot @@ -2,14 +2,14 @@ # This file is distributed under the GPLv2 or later. msgid "" msgstr "" -"Project-Id-Version: Prosopo Procaptcha 1.22.0\n" +"Project-Id-Version: Prosopo Procaptcha 1.24.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/prosopo-procaptcha\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2026-10-27T13:57:59+00:00\n" +"POT-Creation-Date: 2026-10-29T15:26:27+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.12.0\n" "X-Domain: prosopo-procaptcha\n" @@ -113,49 +113,69 @@ msgstr "" msgid "Your favourite plugin is not listed? %1$s Start a thread %2$s in our support forum and we will consider adding the new integration." msgstr "" -#: src/Settings/General/Tab/General_Settings_Tab.php:30 +#: src/Settings/General/Tab/General_Settings_Tab.php:31 msgid "General" msgstr "" -#: src/Settings/General/Tab/General_Settings_Tab.php:99 +#: src/Settings/General/Tab/General_Settings_Tab.php:114 msgid "Your Secret Key:" msgstr "" -#: src/Settings/General/Tab/General_Settings_Tab.php:100 +#: src/Settings/General/Tab/General_Settings_Tab.php:115 msgid "Your Site Key:" msgstr "" -#: src/Settings/General/Tab/General_Settings_Tab.php:101 +#: src/Settings/General/Tab/General_Settings_Tab.php:116 msgid "Theme:" msgstr "" -#: src/Settings/General/Tab/General_Settings_Tab.php:102 +#: src/Settings/General/Tab/General_Settings_Tab.php:117 +msgid "Visitor IP matching:" +msgstr "" + +#: src/Settings/General/Tab/General_Settings_Tab.php:118 msgid "Language:" msgstr "" -#: src/Settings/General/Tab/General_Settings_Tab.php:108 +#: src/Settings/General/Tab/General_Settings_Tab.php:124 msgid "Require from authorized users:" msgstr "" -#: src/Settings/General/Tab/General_Settings_Tab.php:122 +#: src/Settings/General/Tab/General_Settings_Tab.php:140 #: src/Widget/Procaptcha_Widget.php:55 msgid "Dark" msgstr "" -#: src/Settings/General/Tab/General_Settings_Tab.php:123 +#: src/Settings/General/Tab/General_Settings_Tab.php:141 #: src/Widget/Procaptcha_Widget.php:56 msgid "Light" msgstr "" -#: src/Settings/General/Tab/General_Settings_Tab.php:126 +#: src/Settings/General/Tab/General_Settings_Tab.php:145 +msgid "Off (recommended)" +msgstr "" + +#: src/Settings/General/Tab/General_Settings_Tab.php:146 +msgid "On - site is behind Cloudflare" +msgstr "" + +#: src/Settings/General/Tab/General_Settings_Tab.php:147 +msgid "On - visitors connect directly (REMOTE_ADDR)" +msgstr "" + +#: src/Settings/General/Tab/General_Settings_Tab.php:148 +msgid "On - site is behind another proxy (X-Forwarded-For)" +msgstr "" + +#: src/Settings/General/Tab/General_Settings_Tab.php:151 msgid "Same as the site" msgstr "" -#: src/Settings/General/Tab/General_Settings_Tab.php:127 +#: src/Settings/General/Tab/General_Settings_Tab.php:152 msgid "Visitor's browser language" msgstr "" -#: src/Settings/General/Tab/General_Settings_Tab.php:137 +#: src/Settings/General/Tab/General_Settings_Tab.php:162 msgid "Behavior" msgstr "" diff --git a/prosopo-procaptcha/readme.txt b/prosopo-procaptcha/readme.txt index bd904d1..4a11115 100644 --- a/prosopo-procaptcha/readme.txt +++ b/prosopo-procaptcha/readme.txt @@ -155,7 +155,11 @@ Absolutely! The plugin has a [public GitHub repository](https://github.com/proso == Changelog == = 1.24.0 (2026-10-29) = +* Fix: the visitor's IP address is no longer sent for verification by default. Version 1.23.0 sent it, which turned on IP matching and could reject real visitors on sites behind Cloudflare or another proxy. IP matching is now the "Visitor IP matching" setting on the General tab, off by default, with a choice of where the IP comes from: Cloudflare, another proxy (X-Forwarded-For) or a direct connection. The `prosopo/procaptcha/visitor_ip` filter now receives the IP from that setting (empty when off) and REMOTE_ADDR * Fix: forms that submit without reloading the page get a fresh captcha after each submission, as a solved captcha can be verified only once. Previously, resubmitting after another field failed validation was rejected. Covers Contact Form 7, WPForms, Fluent Forms, Formidable Forms, Ninja Forms, Elementor Pro, Everest Forms, JetFormBuilder, User Registration, Beaver Builder, WooCommerce checkout and the Blocksy newsletter form +* Fix: User Registration login forms with the "AJAX login" option on now send the captcha token, so logins are no longer rejected +* Fix: Spectra forms send their own captcha token when a page has several Spectra forms, or a Spectra hidden field before the captcha +* Fix: a widget error, such as a failed background request to Prosopo, no longer clears a token the visitor already has from JavaScript-driven forms * Feature: public JavaScript events - `prosopo-procaptcha:filled` (with the token) and `prosopo-procaptcha:cleared` are dispatched on the widget, and dispatching `prosopo-procaptcha:reset` on a form resets its captcha * Feature: failed verifications are written to the debug log when WP_DEBUG is on, with the API's status and reason, and the new `prosopo/procaptcha/verification_result` action receives every verification response, including the score diff --git a/prosopo-procaptcha/src/Integrations/Plugins/Spectra/Spectra_Form_Integration.php b/prosopo-procaptcha/src/Integrations/Plugins/Spectra/Spectra_Form_Integration.php index 0c84c76..550ec5c 100644 --- a/prosopo-procaptcha/src/Integrations/Plugins/Spectra/Spectra_Form_Integration.php +++ b/prosopo-procaptcha/src/Integrations/Plugins/Spectra/Spectra_Form_Integration.php @@ -67,9 +67,10 @@ protected function replace_stub_form_input_with_widget_field( string $form_conte Widget_Settings::ELEMENT_ATTRIBUTES => array( 'style' => 'margin: 0 0 20px', ), + // No id="hidden" (as Spectra's own hidden field has): Spectra reads that one + // via getElementById(), so only the first such field on the page is sent. Widget_Settings::HIDDEN_INPUT_ATTRIBUTES => array( 'class' => 'uagb-forms-hidden-input', - 'id' => 'hidden', 'name' => $this->stub_form_input_name, ), Widget_Settings::IS_DESIRED_ON_GUESTS => true, @@ -78,9 +79,16 @@ protected function replace_stub_form_input_with_widget_field( string $form_conte ) ); + // Spectra sends each form field under the text of the element whose id is the field's name + // (its field labels), reading the value from the submitted form itself, so it works with several forms per page. + $field_label = sprintf( + '', + esc_attr( $this->stub_form_input_name ) + ); + return $this->spectra_form->replace_input_in_form( $this->stub_form_input_name, - $widget_element, + $widget_element . $field_label, $form_content ); } diff --git a/prosopo-procaptcha/src/Settings/General/Tab/General_Settings_Tab.php b/prosopo-procaptcha/src/Settings/General/Tab/General_Settings_Tab.php index a7737e3..4b447d6 100644 --- a/prosopo-procaptcha/src/Settings/General/Tab/General_Settings_Tab.php +++ b/prosopo-procaptcha/src/Settings/General/Tab/General_Settings_Tab.php @@ -22,6 +22,7 @@ final class General_Settings_Tab extends Settings_Tab_Base implements Procaptcha const THEME = 'theme'; const WIDGET_LANGUAGE = 'widget_language'; const IS_ENABLED_FOR_AUTHORIZED = 'is_enabled_for_authorized'; + const VISITOR_IP_MATCHING = 'visitor_ip_matching'; const LANGUAGE_SITE = 'site'; const LANGUAGE_VISITOR = 'visitor'; @@ -89,6 +90,20 @@ public function should_bypass_authorized_user(): bool { return ! $is_enabled_for_authorized; } + public function get_visitor_ip_source(): string { + $source = string( $this->get_settings(), self::VISITOR_IP_MATCHING ); + + $sources = array( + self::VISITOR_IP_CLOUDFLARE, + self::VISITOR_IP_X_FORWARDED_FOR, + self::VISITOR_IP_REMOTE_ADDR, + ); + + return in_array( $source, $sources, true ) ? + $source : + ''; + } + protected function get_option_name(): string { // For back compatibility. return self::OPTION_BASE; @@ -96,10 +111,11 @@ protected function get_option_name(): string { protected function get_string_settings(): array { return array( - self::SECRET_KEY => __( 'Your Secret Key:', 'prosopo-procaptcha' ), - self::SITE_KEY => __( 'Your Site Key:', 'prosopo-procaptcha' ), - self::THEME => __( 'Theme:', 'prosopo-procaptcha' ), - self::WIDGET_LANGUAGE => __( 'Language:', 'prosopo-procaptcha' ), + self::SECRET_KEY => __( 'Your Secret Key:', 'prosopo-procaptcha' ), + self::SITE_KEY => __( 'Your Site Key:', 'prosopo-procaptcha' ), + self::THEME => __( 'Theme:', 'prosopo-procaptcha' ), + self::VISITOR_IP_MATCHING => __( 'Visitor IP matching:', 'prosopo-procaptcha' ), + self::WIDGET_LANGUAGE => __( 'Language:', 'prosopo-procaptcha' ), ); } @@ -111,18 +127,27 @@ protected function get_bool_settings(): array { protected function get_default_values(): array { return array( - self::THEME => 'light', - self::WIDGET_LANGUAGE => self::LANGUAGE_SITE, + self::THEME => 'light', + // Off, as most sites are behind a proxy such as Cloudflare: matching the wrong IP rejects real visitors. + self::VISITOR_IP_MATCHING => self::VISITOR_IP_OFF, + self::WIDGET_LANGUAGE => self::LANGUAGE_SITE, ); } protected function get_select_inputs(): array { return array( - self::THEME => array( + self::THEME => array( 'dark' => __( 'Dark', 'prosopo-procaptcha' ), 'light' => __( 'Light', 'prosopo-procaptcha' ), ), - self::WIDGET_LANGUAGE => array( + // phpcs:ignore SlevomatCodingStandard.Arrays.AlphabeticallySortedByKeys.IncorrectKeyOrder -- Off first, as it's the default. + self::VISITOR_IP_MATCHING => array( + self::VISITOR_IP_OFF => __( 'Off (recommended)', 'prosopo-procaptcha' ), + self::VISITOR_IP_CLOUDFLARE => __( 'On - site is behind Cloudflare', 'prosopo-procaptcha' ), + self::VISITOR_IP_REMOTE_ADDR => __( 'On - visitors connect directly (REMOTE_ADDR)', 'prosopo-procaptcha' ), + self::VISITOR_IP_X_FORWARDED_FOR => __( 'On - site is behind another proxy (X-Forwarded-For)', 'prosopo-procaptcha' ), + ), + self::WIDGET_LANGUAGE => array( self::LANGUAGE_SITE => __( 'Same as the site', 'prosopo-procaptcha' ), self::LANGUAGE_VISITOR => __( "Visitor's browser language", 'prosopo-procaptcha' ), ), diff --git a/prosopo-procaptcha/src/Settings/Procaptcha_Settings.php b/prosopo-procaptcha/src/Settings/Procaptcha_Settings.php index 68a9b88..7de5003 100644 --- a/prosopo-procaptcha/src/Settings/Procaptcha_Settings.php +++ b/prosopo-procaptcha/src/Settings/Procaptcha_Settings.php @@ -7,6 +7,11 @@ defined( 'ABSPATH' ) || exit; interface Procaptcha_Settings { + const VISITOR_IP_OFF = 'off'; + const VISITOR_IP_CLOUDFLARE = 'cloudflare'; + const VISITOR_IP_X_FORWARDED_FOR = 'x_forwarded_for'; + const VISITOR_IP_REMOTE_ADDR = 'remote_addr'; + public function get_site_key(): string; public function get_secret_key(): string; @@ -19,4 +24,9 @@ public function get_theme(): string; public function get_language(): string; public function should_bypass_authorized_user(): bool; + + /** + * Where the visitor IP for matching comes from (one of the VISITOR_IP_* values), or empty when matching is off. + */ + public function get_visitor_ip_source(): string; } diff --git a/prosopo-procaptcha/src/Widget/Procaptcha_Widget.php b/prosopo-procaptcha/src/Widget/Procaptcha_Widget.php index ea07e52..5ce0790 100644 --- a/prosopo-procaptcha/src/Widget/Procaptcha_Widget.php +++ b/prosopo-procaptcha/src/Widget/Procaptcha_Widget.php @@ -267,14 +267,33 @@ protected function log_verification_failure( string $details ): void { } /** - * Sent to the verification API to improve bot detection. - * REMOTE_ADDR is used as it can't be spoofed; sites behind a proxy (e.g. Cloudflare) - * can supply the real visitor IP via the filter. + * Opt-in (Visitor IP matching setting): when sent, the verification API requires the token + * to be solved from the same IP, which rejects real visitors if the wrong IP is sent, + * e.g. the proxy's address on sites behind Cloudflare. */ protected function get_visitor_ip(): string { $remote_addr = Query_Arguments::get_non_action_string( 'REMOTE_ADDR', Query_Arguments::SERVER ); - $visitor_ip = apply_filters( 'prosopo/procaptcha/visitor_ip', $remote_addr ); + switch ( $this->procaptcha_settings->get_visitor_ip_source() ) { + case Procaptcha_Settings::VISITOR_IP_CLOUDFLARE: + $visitor_ip = Query_Arguments::get_non_action_string( 'HTTP_CF_CONNECTING_IP', Query_Arguments::SERVER ); + break; + case Procaptcha_Settings::VISITOR_IP_X_FORWARDED_FOR: + $forwarded_for = Query_Arguments::get_non_action_string( 'HTTP_X_FORWARDED_FOR', Query_Arguments::SERVER ); + // The first address is the client, the rest are proxies. + $visitor_ip = trim( explode( ',', $forwarded_for )[0] ); + break; + case Procaptcha_Settings::VISITOR_IP_REMOTE_ADDR: + $visitor_ip = $remote_addr; + break; + default: + $visitor_ip = ''; + break; + } + + // Overrides the IP sent for matching, return an empty string to send none. + // Receives the IP from the Visitor IP matching setting (empty when it's off) and REMOTE_ADDR. + $visitor_ip = apply_filters( 'prosopo/procaptcha/visitor_ip', $visitor_ip, $remote_addr ); return is_string( $visitor_ip ) && false !== filter_var( $visitor_ip, FILTER_VALIDATE_IP ) ? $visitor_ip :