Plugin Directory

Changeset 3762168


Ignore:
Timestamp:
10/23/2026 06:01:45 PM (8 days ago)
Author:
landexhub
Message:

Release 0.9.3

Location:
landexhub-consent
Files:
38 edited
1 copied

Legend:

Unmodified
Added
Removed
  • landexhub-consent/tags/0.9.3/assets/js/landexhub-consent.js

    r3758640 r3762168  
    368368        // that outlived the visitor's choice (it expired, or the cookie was removed).
    369369        pushWpConsent(state, "none" === source);
     370        // The signals go out at once, so GTM knows a returning visitor's choice before its first tag.
    370371        gtag("consent", "update", signals(state));
    371372        const ev = { event: cfg.dataLayer.onUpdate };
    372373        ev.landexhub_consent = catBooleans(state);
    373374        ev.landexhub_consent_source = source;
    374         w.dataLayer.push(ev);
     375        // The event is meant for GTM triggers, which never see an event that comes before GTM's
     376        // gtm.js. A page-load event usually does, a choice made in the bar only rarely.
     377        afterGtmStart(function () { w.dataLayer.push(ev); });
     378    }
     379    // Runs fn once the GTM container has started: right away when its gtm.js event is already
     380    // in the dataLayer, otherwise just after the GTM snippet pushes it, whether the snippet
     381    // comes before or after this script. Without GTM on the page fn runs once the page has
     382    // loaded, so other listeners still get the event.
     383    function afterGtmStart(fn) {
     384        const dl = w.dataLayer;
     385        const started = function (e) {
     386            return !!e && typeof e === "object" && e.event === "gtm.js";
     387        };
     388        if (dl.some(started) || "complete" === d.readyState) {
     389            fn();
     390            return;
     391        }
     392        let done = false;
     393        const run = function () {
     394            if (done)
     395                return;
     396            done = true;
     397            if (dl.push === wrapped)
     398                dl.push = original;
     399            fn();
     400        };
     401        const original = dl.push;
     402        const wrapped = function (...items) {
     403            const n = original.apply(dl, items);
     404            if (!done && items.some(started))
     405                run();
     406            return n;
     407        };
     408        dl.push = wrapped;
     409        w.addEventListener("load", run);
    375410    }
    376411    function persist(state) {
  • landexhub-consent/tags/0.9.3/includes/class-landexhub-consent-admin.php

    r3758640 r3762168  
    15651565                        . '</h2><ul class="landexhub-consent-checklist">';
    15661566                foreach ( array_slice( $findings, 0, 6 ) as $f ) {
    1567                         $held  = ! empty( $f['managed'] ) || ! empty( $f['gated'] ) || ! empty( $f['google'] );
     1567                        $held  = ! empty( $f['managed'] ) || ! empty( $f['gated'] ) || ! empty( $f['google'] ) || ! empty( $f['necessary'] );
    15681568                        $ok    = $held && empty( $f['never_runs'] );
    15691569                        $label = '' !== $f['vendor'] ? $f['vendor'] : $f['label'];
    … …  
    24852485         */
    24862486        private function finding_governed( $f ) {
    2487                 return 'consent-mode' === $f['reason'] || ! empty( $f['gated'] );
     2487                return 'consent-mode' === $f['reason'] || ! empty( $f['gated'] ) || ! empty( $f['necessary'] );
    24882488        }
    24892489
    … …  
    25252525                if ( 'consent-mode' === $f['reason'] ) {
    25262526                        return $this->state_pill( true, __( 'Consent Mode v2 — tags inside a GTM container need their own consent settings', 'landexhub-consent' ) );
     2527                }
     2528                if ( ! empty( $f['necessary'] ) && empty( $f['gated'] ) ) {
     2529                        return $this->state_pill( true, __( 'runs for every visitor, there is nothing to hold back', 'landexhub-consent' ), __( 'Necessary', 'landexhub-consent' ) );
    25272530                }
    25282531                $problem = $this->gate_problem( $f );
    … …  
    26022605         * source, so it stays readable in grayscale and in `forced-colors` mode.
    26032606         *
    2604          * @param bool   $ok   Whether consent governs the source.
    2605          * @param string $note How it is governed (or why not).
     2607         * @param bool   $ok    Whether consent governs the source.
     2608         * @param string $note  How it is governed (or why not).
     2609         * @param string $label Pill text instead of the default one.
    26062610         * @return string HTML.
    26072611         */
    2608         private function state_pill( $ok, $note ) {
     2612        private function state_pill( $ok, $note, $label = '' ) {
    26092613                $class = $ok ? 'landexhub-consent-pill is-ok' : 'landexhub-consent-pill is-warn';
    2610                 $label = $ok ? __( 'Consent governs it', 'landexhub-consent' ) : __( 'Always loads', 'landexhub-consent' );
     2614                if ( '' === $label ) {
     2615                        $label = $ok ? __( 'Consent governs it', 'landexhub-consent' ) : __( 'Always loads', 'landexhub-consent' );
     2616                }
    26112617
    26122618                return '<span class="' . esc_attr( $class ) . '">' . esc_html( $label ) . '</span>'
    … …  
    28212827         *
    28222828         * @param string|null $page Target page (default Consent integrations).
     2829         * @param array       $args Further query arguments of the target page, e.g. the service of a detail.
    28232830         * @return string
    28242831         */
    2825         private function rescan_url( $page = null ) {
     2832        private function rescan_url( $page = null, array $args = array() ) {
    28262833                $page = null === $page ? self::PAGE_INTEGRATIONS : $page;
    2827                 return wp_nonce_url(
    2828                         admin_url( 'admin.php?page=' . $page . '&cnsx_rescan_sources=1' ),
    2829                         'landexhub_consent_rescan_sources'
    2830                 );
     2834                $url  = admin_url( 'admin.php?page=' . $page );
     2835                if ( $args ) {
     2836                        $url = add_query_arg( array_map( 'rawurlencode', $args ), $url );
     2837                }
     2838                return wp_nonce_url( add_query_arg( 'cnsx_rescan_sources', '1', $url ), 'landexhub_consent_rescan_sources' );
    28312839        }
    28322840
    … …  
    35183526                        // Whether consent governs the service.
    35193527                        echo '<td>';
    3520                         if ( $item['governed'] ) {
     3528                        if ( $this->item_necessary( $item ) ) {
     3529                                echo '<span class="landexhub-consent-pill is-ok">' . esc_html__( 'Necessary', 'landexhub-consent' ) . '</span>';
     3530                        } elseif ( $item['governed'] ) {
    35213531                                echo '<span class="landexhub-consent-pill is-ok">' . esc_html__( 'Consent governs it', 'landexhub-consent' ) . '</span>';
    35223532                        } else {
    … …  
    35573567         * part is never submitted together with the visible one.
    35583568         *
    3559          * @return void
    3560          */
    3561         public function render_scripts_help() {
     3569         * @param string $verify_url Where "Verify the edit" checks the site again and returns to:
     3570         *                           the page the dialog is on (default Consent integrations).
     3571         * @return void
     3572         */
     3573        public function render_scripts_help( $verify_url = '' ) {
    35623574                echo '<dialog class="landexhub-consent-dialog" id="landexhub-consent-gate-dialog">';
    35633575                echo '<div class="landexhub-consent-dialog__head">';
    … …  
    35793591                echo '</div>';
    35803592
    3581                 $this->gate_form_script();
     3593                $this->gate_form_script( '' !== $verify_url ? $verify_url : $this->rescan_url() );
    35823594                $this->gate_form_iframe();
    35833595
    … …  
    35893601         * and the option to save the source to the services list.
    35903602         *
    3591          * @return void
    3592          */
    3593         private function gate_form_script() {
     3603         * @param string $verify_url URL of the "Verify the edit" button.
     3604         * @return void
     3605         */
     3606        private function gate_form_script( $verify_url ) {
    35943607                echo '<form data-cnsx-part="script" hidden method="post" action="' . esc_url( admin_url( 'admin-post.php' ) ) . '">';
    35953608                wp_nonce_field( 'landexhub_consent_service' );
    … …  
    36213634                echo '</div>';
    36223635
    3623                 echo '<p><a class="button" href="' . esc_url( $this->rescan_url() ) . '">' . esc_html__( 'Verify the edit', 'landexhub-consent' ) . '</a></p>';
     3636                echo '<p><a class="button" href="' . esc_url( $verify_url ) . '">' . esc_html__( 'Verify the edit', 'landexhub-consent' ) . '</a></p>';
    36243637
    36253638                echo '<div class="landexhub-consent-notice-warn">'
    … …  
    37723785
    37733786                                $this->add_measurement_dialog();
    3774                                 $this->render_scripts_help();
     3787                                $this->render_scripts_help( $this->rescan_url( self::PAGE_SERVICES ) );
    37753788                                $this->addon_note();
    37763789                        },
    … …  
    38783891                require_once LANDEXHUB_CONSENT_PLUGIN_DIR . 'includes/class-landexhub-consent-services.php';
    38793892                require_once LANDEXHUB_CONSENT_PLUGIN_DIR . 'includes/class-landexhub-consent-frontend.php';
    3880 
     3893                require_once LANDEXHUB_CONSENT_PLUGIN_DIR . 'includes/class-landexhub-consent-scan.php';
     3894
     3895                // "Verify the edit" comes back here with a new check of the front page.
     3896                $scan  = LandexHub_Consent_Scan::run( $this->consume_rescan() );
    38813897                $items = LandexHub_Consent_Inventory::items();
    38823898                $back  = admin_url( 'admin.php?page=' . self::PAGE_SERVICES );
    … …  
    38953911                }
    38963912                $item = $items[ $id ];
    3897                 $scan = LandexHub_Consent_Scan::run( false );
    38983913
    38993914                $this->shell(
    … …  
    39183933                                }
    39193934
    3920                                 if ( ! empty( $item['governed'] ) || $is_configured ) {
     3935                                if ( $this->item_necessary( $item ) ) {
     3936                                        echo '<li><span class="landexhub-consent-check-ok">&#10003;</span> ' . esc_html__( 'Necessary — it runs for every visitor, there is nothing to hold back', 'landexhub-consent' ) . '</li>';
     3937                                } elseif ( ! empty( $item['governed'] ) || $is_configured ) {
    39213938                                        echo '<li><span class="landexhub-consent-check-ok">&#10003;</span> ' . esc_html__( 'Consent governs it', 'landexhub-consent' ) . '</li>';
    39223939                                } else {
    … …  
    39823999                                }
    39834000
    3984                                 $this->render_scripts_help();
     4001                                $this->render_scripts_help( $this->rescan_url( self::PAGE_SERVICES, array( 'service' => $id ) ) );
    39854002                        },
    39864003                        'integrations'
    … …  
    40834100
    40844101        /**
     4102         * A service the catalog files as necessary (payments, spam protection): it runs for
     4103         * every visitor, so it is neither held back nor a problem.
     4104         *
     4105         * @param array $item Inventory item.
     4106         * @return bool
     4107         */
     4108        private function item_necessary( $item ) {
     4109                return 'necessary' === (string) $item['category'] && ! empty( $item['in_catalog'] );
     4110        }
     4111
     4112        /**
    40854113         * Status label of a service row.
    40864114         *
    … …  
    40924120                        return array( 'is-muted', __( 'Unassigned', 'landexhub-consent' ) );
    40934121                }
     4122                if ( $this->item_necessary( $item ) ) {
     4123                        return array( 'is-ok', __( 'Necessary', 'landexhub-consent' ) );
     4124                }
    40944125                if ( empty( $item['governed'] ) ) {
    40954126                        return array( 'is-warn', ! empty( $item['partial'] ) ? __( 'Partly governed', 'landexhub-consent' ) : __( 'Not governed yet', 'landexhub-consent' ) );
    … …  
    41104141                if ( ! empty( $item['configured'] ) ) {
    41114142                        echo '<span>' . esc_html__( 'Consent Mode v2 governs the consent.', 'landexhub-consent' ) . '</span>';
     4143                        return;
     4144                }
     4145                if ( $this->item_necessary( $item ) ) {
     4146                        echo '<span>' . esc_html__( 'Necessary — it runs for every visitor, there is nothing to hold back.', 'landexhub-consent' ) . '</span>';
    41124147                        return;
    41134148                }
  • landexhub-consent/tags/0.9.3/includes/class-landexhub-consent-frontend.php

    r3758640 r3762168  
    3030                // Priority 5: optional GTM / gtag.js container right after the bootstrap.
    3131                add_action( 'wp_head', array( $this, 'print_google_tags' ), 5 );
     32                // The GTM <noscript> part goes immediately after the opening <body> tag, as Google asks.
     33                add_action( 'wp_body_open', array( $this, 'print_gtm_noscript' ), 0 );
    3234                // Priority 1: enqueue the core (UI, script activation, consent updates) early.
    3335                add_action( 'wp_enqueue_scripts', array( $this, 'enqueue' ), 1 );
    … …  
    157159        public static function exclude_handles( $handles ) {
    158160                $handles = is_array( $handles ) ? $handles : array();
    159                 foreach ( array( self::HANDLE, 'landexhub-consent-detect', 'landexhub-consent-gtag' ) as $handle ) {
     161                foreach ( array( self::HANDLE, 'landexhub-consent-detect' ) as $handle ) {
    160162                        if ( ! in_array( $handle, $handles, true ) ) {
    161163                                $handles[] = $handle;
    … …  
    469471                }
    470472
     473                // Google's snippets are printed as Google publishes them. The only addition is an id,
     474                // by which the site check tells the plugin's own tags from tags others add.
    471475                if ( '' !== $gtm ) {
    472476                        $js = "(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});"
    … …  
    474478                                . "j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);"
    475479                                . "})(window,document,'script','dataLayer','" . esc_js( $gtm ) . "');";
     480                        echo "<!-- Google Tag Manager -->\n";
    476481                        wp_print_inline_script_tag( $js, array( 'id' => 'landexhub-consent-gtm' ) );
     482                        echo "<!-- End Google Tag Manager -->\n";
    477483                }
    478484
    … …  
    485491                        }
    486492
    487                         wp_enqueue_script(
    488                                 'landexhub-consent-gtag',
    489                                 'https://www.googletagmanager.com/gtag/js?id=' . rawurlencode( $gtag ),
    490                                 array(),
    491                                 null, // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion -- Third-party script versioned by Google, not by this plugin; no version query string is added to its URL.
    492                                 false
    493                         );
     493                        // The async loader first, then the config, as in Google's snippet. Enqueueing would
     494                        // drop async: WordPress loads a script with an inline "after" part blocking.
    494495                        $js = 'window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}'
    495496                                . "gtag('js',new Date());gtag('config','" . esc_js( $gtag ) . "');";
    496                         wp_add_inline_script( 'landexhub-consent-gtag', $js );
    497                 }
     497                        echo "<!-- Google tag (gtag.js) -->\n";
     498                        wp_print_script_tag(
     499                                array(
     500                                        'async' => true,
     501                                        'src'   => 'https://www.googletagmanager.com/gtag/js?id=' . rawurlencode( $gtag ),
     502                                        'id'    => 'landexhub-consent-gtag-js',
     503                                )
     504                        );
     505                        wp_print_inline_script_tag( $js, array( 'id' => 'landexhub-consent-gtag-js-after' ) );
     506                }
     507        }
     508
     509        /**
     510         * The <noscript> part of Google's GTM snippet, immediately after the opening <body> tag
     511         * (themes call wp_body_open() there). Without JavaScript there is no consent bar and no
     512         * Consent Mode default, so the frame loads without a consent state, as in Google's own
     513         * installation.
     514         *
     515         * @return void
     516         */
     517        public function print_gtm_noscript() {
     518                $settings = LandexHub_Consent_Settings::get();
     519                $gtm      = (string) $settings['gtm_id'];
     520                if ( '' === $gtm ) {
     521                        return;
     522                }
     523                // The same condition as for the container in <head>: no frame without it.
     524                if ( $this->emits_consent_default() && '' === $this->bootstrap_js() ) {
     525                        return;
     526                }
     527                echo "<!-- Google Tag Manager (noscript) -->\n"
     528                        . '<noscript><iframe id="landexhub-consent-gtm-noscript" src="' . esc_url( 'https://www.googletagmanager.com/ns.html?id=' . rawurlencode( $gtm ) ) . '"'
     529                        . ' height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>' . "\n"
     530                        . "<!-- End Google Tag Manager (noscript) -->\n";
    498531        }
    499532
  • landexhub-consent/tags/0.9.3/includes/class-landexhub-consent-google-check.php

    r3758640 r3762168  
    102102                // Remove all of our own tags so they do not look like a second snippet:
    103103                // landexhub-consent-gtm      inline GTM loader
    104                 // landexhub-consent-gtag-js  enqueued gtag.js (WordPress adds "-js" to the handle)
     104                // landexhub-consent-gtag-js  gtag.js loader (and -after, its config)
     105                // landexhub-consent-gtm-noscript  the GTM <noscript> frame
    105106                // Lazy-load plugins may rewrite src to data-src, so the id is the only reliable
    106107                // anchor.
    107108                $without_ours = preg_replace(
    108                         '/<script[^>]*\bid=["\']landexhub-consent-[^"\']*["\'][^>]*>[\s\S]*?<\/script>/i',
     109                        '/<(script|iframe)[^>]*\bid=["\']landexhub-consent-[^"\']*["\'][^>]*>[\s\S]*?<\/\1>/i',
    109110                        '',
    110111                        $html
  • landexhub-consent/tags/0.9.3/includes/class-landexhub-consent-health.php

    r3758640 r3762168  
    151151                foreach ( isset( $scan['findings'] ) ? (array) $scan['findings'] : array() as $f ) {
    152152                        $name = '' !== (string) $f['vendor'] ? (string) $f['vendor'] : (string) $f['label'];
    153                         if ( empty( $f['google'] ) && empty( $f['gated'] ) ) {
     153                        if ( empty( $f['google'] ) && empty( $f['gated'] ) && empty( $f['necessary'] ) ) {
    154154                                $loose[] = $name;
    155155                        } elseif ( ! empty( $f['never_runs'] ) ) {
  • landexhub-consent/tags/0.9.3/includes/class-landexhub-consent-inventory.php

    r3758640 r3762168  
    255255
    256256        /**
    257          * Match a stored service to a registry record via pattern substrings.
     257         * Match a stored service to a registry record via its name or pattern substrings.
    258258         *
    259259         * @param array $service  Stored service.
    … …  
    263263        private static function match_service( $service, $registry ) {
    264264                $patterns = isset( $service['patterns'] ) ? (array) $service['patterns'] : array();
     265
     266                // An entry saved from an inline snippet carries the service name instead of a host
     267                // (the snippet has none), so the catalog name and aliases count too. Otherwise the
     268                // entry would show up as a second service next to its catalog record.
     269                $name = strtolower( trim( isset( $service['name'] ) ? (string) $service['name'] : '' ) );
     270                if ( '' !== $name ) {
     271                        foreach ( $registry as $id => $record ) {
     272                                $names = array_merge(
     273                                        isset( $record['name'] ) ? array( (string) $record['name'] ) : array(),
     274                                        isset( $record['aliases'] ) ? (array) $record['aliases'] : array()
     275                                );
     276                                foreach ( $names as $candidate ) {
     277                                        if ( strtolower( trim( (string) $candidate ) ) === $name ) {
     278                                                return (string) $id;
     279                                        }
     280                                }
     281                        }
     282                }
     283
    265284                foreach ( $registry as $id => $record ) {
    266285                        $det  = isset( $record['detection'] ) ? (array) $record['detection'] : array();
  • landexhub-consent/tags/0.9.3/includes/class-landexhub-consent-scan.php

    r3758640 r3762168  
    440440                $vendor = LandexHub_Consent_Vendors::lookup( $needle );
    441441                $google = (bool) ( $vendor && ! empty( $vendor['consentModeAware'] ) );
     442                // Payments, spam protection and the like: the catalog files them as necessary, they
     443                // run for every visitor and there is nothing to hold back.
     444                $necessary = ! $google && $vendor && 'necessary' === (string) $vendor['category'];
    442445
    443446                return array(
    … …  
    462465                        // Why marked occurrences are not gated (GATE_* codes).
    463466                        'problems'    => array(),
    464                         'reason'      => $google ? 'consent-mode' : '',
     467                        'reason'      => $google ? 'consent-mode' : ( $necessary ? 'necessary' : '' ),
    465468                        'evidence'    => '',
    466469                        'google'      => $google,
     470                        'necessary'   => $necessary,
    467471                );
    468472        }
  • landexhub-consent/tags/0.9.3/landexhub-consent.php

    r3758640 r3762168  
    88 * Plugin Name:       LandexHub Consent – Cookie Banner, GDPR & Google Consent Mode v2
    99 * Description:       Cookie banner for GDPR with Google Consent Mode v2, script gating, site diagnostics and consent logging. No cloud service required.
    10  * Version:           0.9.2
     10 * Version:           0.9.3
    1111 * Requires at least: 6.3
    1212 * Requires PHP:      7.4
    … …  
    2121defined( 'ABSPATH' ) || exit;
    2222
    23 define( 'LANDEXHUB_CONSENT_VERSION', '0.9.2' );
     23define( 'LANDEXHUB_CONSENT_VERSION', '0.9.3' );
    2424define( 'LANDEXHUB_CONSENT_PLUGIN_FILE', __FILE__ );
    2525define( 'LANDEXHUB_CONSENT_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
  • landexhub-consent/tags/0.9.3/languages/landexhub-consent-cs_CZ.po

    r3758640 r3762168  
    937937msgstr "Nezbytné — popis"
    938938
     939msgid "Necessary — it runs for every visitor, there is nothing to hold back"
     940msgstr "Nezbytné — běží pro každého návštěvníka, není co zadržovat"
     941
     942msgid "Necessary — it runs for every visitor, there is nothing to hold back."
     943msgstr "Nezbytné — běží pro každého návštěvníka, není co zadržovat."
     944
    939945msgid "Necessary — name"
    940946msgstr "Nezbytné — název"
    … …  
    11971203msgid "Rounding of the bar and the settings window, in pixels."
    11981204msgstr "Zaoblení lišty a okna s nastavením, v pixelech."
     1205
     1206msgid "runs for every visitor, there is nothing to hold back"
     1207msgstr "běží pro každého návštěvníka, není co zadržovat"
    11991208
    12001209msgid "Save"
  • landexhub-consent/tags/0.9.3/languages/landexhub-consent-de_DE.po

    r3758640 r3762168  
    929929msgstr "Notwendig — Beschreibung"
    930930
     931msgid "Necessary — it runs for every visitor, there is nothing to hold back"
     932msgstr "Notwendig – läuft für alle Besucher, es gibt nichts zurückzuhalten"
     933
     934msgid "Necessary — it runs for every visitor, there is nothing to hold back."
     935msgstr "Notwendig – läuft für alle Besucher, es gibt nichts zurückzuhalten."
     936
    931937msgid "Necessary — name"
    932938msgstr "Notwendig — Name"
    … …  
    11891195msgid "Rounding of the bar and the settings window, in pixels."
    11901196msgstr "Rundung der Leiste und des Einstellungsfensters, in Pixeln."
     1197
     1198msgid "runs for every visitor, there is nothing to hold back"
     1199msgstr "läuft für alle Besucher, es gibt nichts zurückzuhalten"
    11911200
    11921201msgid "Save"
  • landexhub-consent/tags/0.9.3/languages/landexhub-consent-pl_PL.po

    r3758640 r3762168  
    937937msgstr "Niezbędne — opis"
    938938
     939msgid "Necessary — it runs for every visitor, there is nothing to hold back"
     940msgstr "Niezbędne — działa dla każdego odwiedzającego, nie ma czego wstrzymywać"
     941
     942msgid "Necessary — it runs for every visitor, there is nothing to hold back."
     943msgstr "Niezbędne — działa dla każdego odwiedzającego, nie ma czego wstrzymywać."
     944
    939945msgid "Necessary — name"
    940946msgstr "Niezbędne — nazwa"
    … …  
    11971203msgid "Rounding of the bar and the settings window, in pixels."
    11981204msgstr "Zaokrąglenie paska i okna ustawień, w pikselach."
     1205
     1206msgid "runs for every visitor, there is nothing to hold back"
     1207msgstr "działa dla każdego odwiedzającego, nie ma czego wstrzymywać"
    11991208
    12001209msgid "Save"
  • landexhub-consent/tags/0.9.3/languages/landexhub-consent-sk_SK.po

    r3758640 r3762168  
    937937msgstr "Nevyhnutné — popis"
    938938
     939msgid "Necessary — it runs for every visitor, there is nothing to hold back"
     940msgstr "Nevyhnutné — beží pre každého návštevníka, nie je čo zadržiavať"
     941
     942msgid "Necessary — it runs for every visitor, there is nothing to hold back."
     943msgstr "Nevyhnutné — beží pre každého návštevníka, nie je čo zadržiavať."
     944
    939945msgid "Necessary — name"
    940946msgstr "Nevyhnutné — názov"
    … …  
    11971203msgid "Rounding of the bar and the settings window, in pixels."
    11981204msgstr "Zaoblenie lišty a okna s nastavením, v pixeloch."
     1205
     1206msgid "runs for every visitor, there is nothing to hold back"
     1207msgstr "beží pre každého návštevníka, nie je čo zadržiavať"
    11991208
    12001209msgid "Save"
  • landexhub-consent/tags/0.9.3/languages/landexhub-consent.pot

    r3758640 r3762168  
    1313
    1414#. translators: accessible suffix telling screen readers the link opens a new tab.
    15 #: includes/class-landexhub-consent-admin.php:783 includes/class-landexhub-consent-admin.php:3790
     15#: includes/class-landexhub-consent-admin.php:783 includes/class-landexhub-consent-admin.php:3803
    1616msgid "(opens in a new tab)"
    1717msgstr ""
    1818
    1919#. translators: %d: number of services.
    20 #: includes/class-landexhub-consent-admin.php:3853
     20#: includes/class-landexhub-consent-admin.php:3866
    2121msgid "%d all good"
    2222msgstr ""
    2323
    2424#. translators: %d: number of checks.
    25 #: includes/class-landexhub-consent-admin.php:4265
     25#: includes/class-landexhub-consent-admin.php:4300
    2626msgid "%d check is not verified yet."
    2727msgid_plural "%d checks are not verified yet."
    … …  
    3737
    3838#. translators: %d: number of issues.
    39 #: includes/class-landexhub-consent-admin.php:4259
     39#: includes/class-landexhub-consent-admin.php:4294
    4040msgid "%d issue requires attention"
    4141msgid_plural "%d issues require attention"
    … …  
    5858
    5959#. translators: %d: number of services.
    60 #: includes/class-landexhub-consent-admin.php:3857
     60#: includes/class-landexhub-consent-admin.php:3870
    6161msgid "%d needs attention"
    6262msgstr ""
    … …  
    7373
    7474#. translators: %d: number of services.
    75 #: includes/class-landexhub-consent-admin.php:3850
     75#: includes/class-landexhub-consent-admin.php:3863
    7676msgid "%d services found"
    7777msgstr ""
    … …  
    9292
    9393#. translators: %d: number of sources.
    94 #: includes/class-landexhub-consent-admin.php:3861
     94#: includes/class-landexhub-consent-admin.php:3874
    9595msgid "%d unassigned"
    9696msgstr ""
    … …  
    104104
    105105#. translators: %s: plugin name.
    106 #: includes/class-landexhub-consent-admin.php:2717
     106#: includes/class-landexhub-consent-admin.php:2723
    107107msgid "%s — it inserts its own Google tags and LandexHub Consent does not block them"
    108108msgstr ""
    109109
    110110#. translators: %s: comma-separated list of Google tag IDs.
    111 #: includes/class-landexhub-consent-admin.php:2725
     111#: includes/class-landexhub-consent-admin.php:2731
    112112msgid "%s — loaded by your theme or another plugin, not by LandexHub Consent"
    113113msgstr ""
    … …  
    119119
    120120#. translators: %s: plugin name.
    121 #: includes/class-landexhub-consent-admin.php:2648
     121#: includes/class-landexhub-consent-admin.php:2654
    122122msgid "%s allows measurement before the visitor decides."
    123123msgstr ""
    … …  
    129129
    130130#. translators: %s: plugin name.
    131 #: includes/class-landexhub-consent-admin.php:2675
     131#: includes/class-landexhub-consent-admin.php:2681
    132132msgid "%s sends its own Consent Mode default."
    133133msgstr ""
    … …  
    166166msgstr ""
    167167
    168 #: includes/class-landexhub-consent-admin.php:2986
     168#: includes/class-landexhub-consent-admin.php:2994
    169169msgid "A plugin that gets the decision this way keeps running its own tags — do not block its scripts by hand as well."
    170170msgstr ""
    … …  
    174174msgstr ""
    175175
    176 #: includes/class-landexhub-consent-admin.php:3575
     176#: includes/class-landexhub-consent-admin.php:3587
    177177msgid "a script a plugin enqueues"
    178178msgstr ""
    179179
    180 #: includes/class-landexhub-consent-admin.php:3574
     180#: includes/class-landexhub-consent-admin.php:3586
    181181msgid "a script hardcoded in the template"
    182182msgstr ""
    183183
    184 #: includes/class-landexhub-consent-admin.php:2561
     184#: includes/class-landexhub-consent-admin.php:2564
    185185msgid "a script in the template"
    186186msgstr ""
    187187
    188 #: includes/class-landexhub-consent-admin.php:3576
     188#: includes/class-landexhub-consent-admin.php:3588
    189189msgid "a script written straight into the page"
    190190msgstr ""
    … …  
    198198msgstr ""
    199199
    200 #: includes/class-landexhub-consent-admin.php:2565
     200#: includes/class-landexhub-consent-admin.php:2568
    201201msgid "a tracking pixel"
    202202msgstr ""
    … …  
    218218msgstr ""
    219219
    220 #: includes/class-landexhub-consent-admin.php:2331 includes/class-landexhub-consent-admin.php:3948 includes/class-landexhub-consent-admin.php:4020
     220#: includes/class-landexhub-consent-admin.php:2331 includes/class-landexhub-consent-admin.php:3965 includes/class-landexhub-consent-admin.php:4037
    221221msgid "Actions"
    222222msgstr ""
    … …  
    227227msgstr ""
    228228
    229 #: includes/class-landexhub-consent-admin.php:3770 includes/class-landexhub-consent-admin.php:4173
     229#: includes/class-landexhub-consent-admin.php:3783 includes/class-landexhub-consent-admin.php:4208
    230230msgid "Add measurement"
    231231msgstr ""
    232232
    233 #: includes/class-landexhub-consent-admin.php:4220
     233#: includes/class-landexhub-consent-admin.php:4255
    234234msgid "Add measurement (GTM / gtag)"
    235235msgstr ""
    236236
    237 #: includes/class-landexhub-consent-admin.php:4201
     237#: includes/class-landexhub-consent-admin.php:4236
    238238msgid "Add to the site"
    239239msgstr ""
    240240
    241 #: includes/class-landexhub-consent-admin.php:3629
     241#: includes/class-landexhub-consent-admin.php:3642
    242242msgid "Added by a plugin or the theme?"
    243243msgstr ""
    … …  
    247247msgstr ""
    248248
    249 #: includes/class-landexhub-consent-admin.php:4148
     249#: includes/class-landexhub-consent-admin.php:4183
    250250msgid "Added by you"
    251251msgstr ""
    252252
    253 #: includes/class-landexhub-consent-admin.php:3514 includes/class-landexhub-consent-admin.php:3917
     253#: includes/class-landexhub-consent-admin.php:3522 includes/class-landexhub-consent-admin.php:3932
    254254msgid "Added by you, not found on the front page"
    255255msgstr ""
    256256
    257257#. translators: %s: who inserts the service.
    258 #: includes/class-landexhub-consent-admin.php:4032 includes/class-landexhub-consent-admin.php:4055
     258#: includes/class-landexhub-consent-admin.php:4049 includes/class-landexhub-consent-admin.php:4072
    259259msgid "Adds it: %s"
    260260msgstr ""
    261261
    262 #: includes/class-landexhub-consent-admin.php:130 includes/class-landexhub-consent-admin.php:145 includes/class-landexhub-consent-admin.php:4305
     262#: includes/class-landexhub-consent-admin.php:130 includes/class-landexhub-consent-admin.php:145 includes/class-landexhub-consent-admin.php:4340
    263263msgid "Advanced"
    264264msgstr ""
    … …  
    302302msgstr ""
    303303
    304 #: includes/class-landexhub-consent-admin.php:2610
     304#: includes/class-landexhub-consent-admin.php:2615
    305305msgid "Always loads"
    306306msgstr ""
    … …  
    318318msgstr ""
    319319
    320 #: includes/class-landexhub-consent-admin.php:2553
     320#: includes/class-landexhub-consent-admin.php:2556
    321321msgid "an embedded frame"
    322322msgstr ""
    … …  
    326326msgstr ""
    327327
    328 #: includes/class-landexhub-consent-admin.php:3577
     328#: includes/class-landexhub-consent-admin.php:3589
    329329msgid "an embedded video · iframe"
    330330msgstr ""
    331331
    332 #: includes/class-landexhub-consent-admin.php:2559
     332#: includes/class-landexhub-consent-admin.php:2562
    333333msgid "an enqueued script"
    334334msgstr ""
    335335
    336 #: includes/class-landexhub-consent-admin.php:3606 includes/class-landexhub-consent-admin.php:3699 includes/class-landexhub-consent-services.php:52
     336#: includes/class-landexhub-consent-admin.php:3619 includes/class-landexhub-consent-admin.php:3712 includes/class-landexhub-consent-services.php:52
    337337msgid "Analytics"
    338338msgstr ""
    … …  
    354354msgstr ""
    355355
    356 #: includes/class-landexhub-consent-admin.php:3041
     356#: includes/class-landexhub-consent-admin.php:3049
    357357msgid "Ask all visitors for consent again?"
    358358msgstr ""
    359359
    360 #: includes/class-landexhub-consent-admin.php:3040
     360#: includes/class-landexhub-consent-admin.php:3048
    361361msgid "Ask every visitor again (current choices stop being used)."
    362362msgstr ""
    363363
    364 #: includes/class-landexhub-consent-admin.php:4063
     364#: includes/class-landexhub-consent-admin.php:4080
    365365msgid "Assign"
    366366msgstr ""
    … …  
    374374msgstr ""
    375375
    376 #: includes/class-landexhub-consent-admin.php:3891 includes/class-landexhub-consent-admin.php:3903
     376#: includes/class-landexhub-consent-admin.php:3907 includes/class-landexhub-consent-admin.php:3918
    377377msgid "Back to Services"
    378378msgstr ""
    … …  
    402402msgstr ""
    403403
    404 #: includes/class-landexhub-consent-admin.php:2736
     404#: includes/class-landexhub-consent-admin.php:2742
    405405msgid "Basic mode does not cover everything on this site."
    406406msgstr ""
    … …  
    414414msgstr ""
    415415
    416 #: includes/class-landexhub-consent-admin.php:3626
     416#: includes/class-landexhub-consent-admin.php:3639
    417417msgid "Both parts are required: without type=\"text/plain\" the browser runs the script anyway, and an external script must have src renamed to data-src, or the file is downloaded right away."
    418418msgstr ""
    … …  
    426426msgstr ""
    427427
    428 #: includes/class-landexhub-consent-admin.php:3614 includes/class-landexhub-consent-admin.php:3656
     428#: includes/class-landexhub-consent-admin.php:3627 includes/class-landexhub-consent-admin.php:3669
    429429msgid "By hand in the template"
    430430msgstr ""
    431431
    432432#. translators: %s: registry schema version.
    433 #: includes/class-landexhub-consent-admin.php:3546 includes/class-landexhub-consent-admin.php:3980
     433#: includes/class-landexhub-consent-admin.php:3556 includes/class-landexhub-consent-admin.php:3997
    434434msgid "Catalog data: LandexHub Consent Service Registry %s."
    435435msgstr ""
    … …  
    455455msgstr ""
    456456
    457 #: includes/class-landexhub-consent-admin.php:2042 includes/class-landexhub-consent-admin.php:2329 includes/class-landexhub-consent-admin.php:3476 includes/class-landexhub-consent-admin.php:4017
     457#: includes/class-landexhub-consent-admin.php:2042 includes/class-landexhub-consent-admin.php:2329 includes/class-landexhub-consent-admin.php:3484 includes/class-landexhub-consent-admin.php:4034
    458458msgid "Category"
    459459msgstr ""
    … …  
    468468msgstr ""
    469469
    470 #: includes/class-landexhub-consent-admin.php:4098
     470#: includes/class-landexhub-consent-admin.php:4129
    471471msgid "Category turned off"
    472472msgstr ""
    … …  
    476476msgstr ""
    477477
    478 #: includes/class-landexhub-consent-admin.php:2903
     478#: includes/class-landexhub-consent-admin.php:2911
    479479msgid "Channel"
    480480msgstr ""
    481481
    482 #: includes/class-landexhub-consent-admin.php:4254
     482#: includes/class-landexhub-consent-admin.php:4289
    483483msgid "Check again"
    484484msgstr ""
    485485
    486 #: includes/class-landexhub-consent-admin.php:3667
     486#: includes/class-landexhub-consent-admin.php:3680
    487487msgid "Check that it follows consent, not just the click."
    488488msgstr ""
    … …  
    492492msgstr ""
    493493
    494 #: includes/class-landexhub-consent-admin.php:3056
     494#: includes/class-landexhub-consent-admin.php:3064
    495495msgid "Choose a JSON file created by Export settings. Nothing is changed unless the whole file is valid."
    496496msgstr ""
    497497
    498 #: includes/class-landexhub-consent-admin.php:1722 includes/class-landexhub-consent-admin.php:2133 includes/class-landexhub-consent-admin.php:3565 includes/class-landexhub-consent-admin.php:3715 includes/class-landexhub-consent-admin.php:4174 includes/class-landexhub-consent-admin.php:4200
     498#: includes/class-landexhub-consent-admin.php:1722 includes/class-landexhub-consent-admin.php:2133 includes/class-landexhub-consent-admin.php:3577 includes/class-landexhub-consent-admin.php:3728 includes/class-landexhub-consent-admin.php:4209 includes/class-landexhub-consent-admin.php:4235
    499499msgid "Close"
    500500msgstr ""
    … …  
    512512msgstr ""
    513513
    514 #: includes/class-landexhub-consent-admin.php:3604 includes/class-landexhub-consent-admin.php:3697 includes/class-landexhub-consent-frontend.php:303
     514#: includes/class-landexhub-consent-admin.php:3617 includes/class-landexhub-consent-admin.php:3710 includes/class-landexhub-consent-frontend.php:303
    515515msgid "Consent category"
    516516msgstr ""
    … …  
    520520msgstr ""
    521521
    522 #: includes/class-landexhub-consent-admin.php:2610 includes/class-landexhub-consent-admin.php:3521 includes/class-landexhub-consent-admin.php:3921 includes/class-landexhub-consent-admin.php:4100
     522#: includes/class-landexhub-consent-admin.php:2615 includes/class-landexhub-consent-admin.php:3531 includes/class-landexhub-consent-admin.php:3938 includes/class-landexhub-consent-admin.php:4131
    523523msgid "Consent governs it"
    524524msgstr ""
    525525
    526 #: includes/class-landexhub-consent-admin.php:4060
     526#: includes/class-landexhub-consent-admin.php:4077
    527527msgid "Consent governs it — the service is not in the catalog or in your services list."
    528528msgstr ""
    … …  
    537537msgstr ""
    538538
    539 #: includes/class-landexhub-consent-admin.php:141 includes/class-landexhub-consent-admin.php:2787
     539#: includes/class-landexhub-consent-admin.php:141 includes/class-landexhub-consent-admin.php:2793
    540540msgid "Consent integrations"
    541541msgstr ""
    542542
    543 #: includes/class-landexhub-consent-admin.php:142 includes/class-landexhub-consent-admin.php:549 includes/class-landexhub-consent-admin.php:3010 includes/class-landexhub-consent-privacy.php:85
     543#: includes/class-landexhub-consent-admin.php:142 includes/class-landexhub-consent-admin.php:549 includes/class-landexhub-consent-admin.php:3018 includes/class-landexhub-consent-privacy.php:85
    544544msgid "Consent log"
    545545msgstr ""
    546546
    547 #: includes/class-landexhub-consent-admin.php:4273
     547#: includes/class-landexhub-consent-admin.php:4308
    548548msgid "Consent Mode"
    549549msgstr ""
    … …  
    569569msgstr ""
    570570
    571 #: includes/class-landexhub-consent-admin.php:4111 includes/class-landexhub-consent-admin.php:4128
     571#: includes/class-landexhub-consent-admin.php:4142 includes/class-landexhub-consent-admin.php:4163
    572572msgid "Consent Mode v2 governs the consent."
    573573msgstr ""
    574574
    575 #: includes/class-landexhub-consent-admin.php:4279
     575#: includes/class-landexhub-consent-admin.php:4314
    576576msgid "Consent setup"
    577577msgstr ""
    … …  
    581581msgstr ""
    582582
    583 #: includes/class-landexhub-consent-admin.php:3034
     583#: includes/class-landexhub-consent-admin.php:3042
    584584msgid "Consents & settings"
    585585msgstr ""
    586586
    587 #: includes/class-landexhub-consent-admin.php:4288
     587#: includes/class-landexhub-consent-admin.php:4323
    588588msgid "Consents in the last 30 days"
    589589msgstr ""
    … …  
    605605msgstr ""
    606606
    607 #: includes/class-landexhub-consent-admin.php:3620
     607#: includes/class-landexhub-consent-admin.php:3633
    608608msgid "Copy"
    609609msgstr ""
    610610
    611 #: includes/class-landexhub-consent-admin.php:3065
     611#: includes/class-landexhub-consent-admin.php:3073
    612612msgid "Copy this when contacting support."
    613613msgstr ""
    … …  
    665665msgstr ""
    666666
    667 #: includes/class-landexhub-consent-admin.php:3610
     667#: includes/class-landexhub-consent-admin.php:3623
    668668msgid "Decides when the source may run. The snippet below follows it."
    669669msgstr ""
    … …  
    702702msgstr ""
    703703
    704 #: includes/class-landexhub-consent-admin.php:4046
     704#: includes/class-landexhub-consent-admin.php:4063
    705705msgid "Detail"
    706706msgstr ""
    … …  
    710710msgstr ""
    711711
    712 #: includes/class-landexhub-consent-admin.php:3064
     712#: includes/class-landexhub-consent-admin.php:3072
    713713msgid "Diagnostic report"
    714714msgstr ""
    715715
    716 #: includes/class-landexhub-consent-admin.php:129 includes/class-landexhub-consent-admin.php:4236
     716#: includes/class-landexhub-consent-admin.php:129 includes/class-landexhub-consent-admin.php:4271
    717717msgid "Diagnostics"
    718718msgstr ""
    … …  
    722722msgstr ""
    723723
    724 #: includes/class-landexhub-consent-admin.php:4189
     724#: includes/class-landexhub-consent-admin.php:4224
    725725msgid "Direct measurement ID (gtag.js)"
    726726msgstr ""
    … …  
    738738msgstr ""
    739739
    740 #: includes/class-landexhub-consent-admin.php:3049
     740#: includes/class-landexhub-consent-admin.php:3057
    741741msgid "Download the configuration as JSON."
    742742msgstr ""
    … …  
    754754msgstr ""
    755755
    756 #: includes/class-landexhub-consent-admin.php:2587
     756#: includes/class-landexhub-consent-admin.php:2590
    757757msgid "embedded frames cannot be held back by the consent bar"
    758758msgstr ""
    759759
    760 #: includes/class-landexhub-consent-admin.php:4269
     760#: includes/class-landexhub-consent-admin.php:4304
    761761msgid "every check below was actually performed; hover a row for its evidence."
    762762msgstr ""
    … …  
    778778msgstr ""
    779779
    780 #: includes/class-landexhub-consent-admin.php:3471
     780#: includes/class-landexhub-consent-admin.php:3479
    781781msgid "Everything LandexHub Consent knows about the services this site uses — catalog knowledge, what the check found here, and your own services list. Catalog updates never overwrite your list."
    782782msgstr ""
    783783
    784 #: includes/class-landexhub-consent-admin.php:4268
     784#: includes/class-landexhub-consent-admin.php:4303
    785785msgid "Everything looks good"
    786786msgstr ""
    787787
    788 #: includes/class-landexhub-consent-admin.php:3947
     788#: includes/class-landexhub-consent-admin.php:3964
    789789msgid "Evidence"
    790790msgstr ""
    … …  
    802802msgstr ""
    803803
    804 #: includes/class-landexhub-consent-admin.php:3048 includes/class-landexhub-consent-admin.php:3050
     804#: includes/class-landexhub-consent-admin.php:3056 includes/class-landexhub-consent-admin.php:3058
    805805msgid "Export settings"
    806806msgstr ""
    … …  
    826826msgstr ""
    827827
    828 #: includes/class-landexhub-consent-admin.php:3615
     828#: includes/class-landexhub-consent-admin.php:3628
    829829msgid "Find the tag in the template and rewrite it like this. LandexHub Consent runs it once the visitor consents to the category."
    830830msgstr ""
    … …  
    863863msgstr ""
    864864
    865 #: includes/class-landexhub-consent-admin.php:3477
     865#: includes/class-landexhub-consent-admin.php:3485
    866866msgid "Found here"
    867867msgstr ""
    … …  
    879879msgstr ""
    880880
    881 #: includes/class-landexhub-consent-admin.php:3912
     881#: includes/class-landexhub-consent-admin.php:3927
    882882msgid "Found on this site"
    883883msgstr ""
    884884
    885 #: includes/class-landexhub-consent-admin.php:4190
     885#: includes/class-landexhub-consent-admin.php:4225
    886886msgid "GA4 or Google Ads without a container (G-XXXX / AW-XXXX). The Basic/Advanced switch applies to it."
    887887msgstr ""
    … …  
    891891msgstr ""
    892892
    893 #: includes/class-landexhub-consent-admin.php:4061
     893#: includes/class-landexhub-consent-admin.php:4078
    894894msgid "Gate it by hand and save it to your services list with a category."
    895895msgstr ""
    896896
    897 #: includes/class-landexhub-consent-admin.php:3568
     897#: includes/class-landexhub-consent-admin.php:3580
    898898msgid "Gate source"
    899899msgstr ""
    900900
    901 #: includes/class-landexhub-consent-admin.php:2533
     901#: includes/class-landexhub-consent-admin.php:2536
    902902msgid "gated by hand"
    903903msgstr ""
    … …  
    920920msgstr ""
    921921
    922 #: includes/class-landexhub-consent-admin.php:4182
     922#: includes/class-landexhub-consent-admin.php:4217
    923923msgid "Google Tag Manager"
    924924msgstr ""
    925925
    926 #: includes/class-landexhub-consent-admin.php:3478
     926#: includes/class-landexhub-consent-admin.php:3486
    927927msgid "Governance"
    928928msgstr ""
    … …  
    940940msgstr ""
    941941
    942 #: includes/class-landexhub-consent-admin.php:4131
     942#: includes/class-landexhub-consent-admin.php:4166
    943943msgid "Held back until the visitor consents."
    944944msgstr ""
    945945
    946 #: includes/class-landexhub-consent-admin.php:4123
     946#: includes/class-landexhub-consent-admin.php:4158
    947947msgid "Held back, but it waits for a category the consent bar does not offer, so it never runs. Turn the category on or remove the source."
    948948msgstr ""
    949949
    950 #: includes/class-landexhub-consent-admin.php:2588
     950#: includes/class-landexhub-consent-admin.php:2591
    951951msgid "held back, but its category is turned off, so it never runs"
    952952msgstr ""
    … …  
    960960msgstr ""
    961961
    962 #: includes/class-landexhub-consent-admin.php:2939
     962#: includes/class-landexhub-consent-admin.php:2947
    963963msgid "How"
    964964msgstr ""
    … …  
    976976msgstr ""
    977977
    978 #: includes/class-landexhub-consent-admin.php:3630
     978#: includes/class-landexhub-consent-admin.php:3643
    979979msgid "If it comes through enqueue, leave the tag alone — add this to functions.php."
    980980msgstr ""
    981981
    982 #: includes/class-landexhub-consent-admin.php:4217
     982#: includes/class-landexhub-consent-admin.php:4252
    983983msgid "If you want measurement, add it through LandexHub Consent — consent is handled from the first moment."
    984984msgstr ""
    … …  
    988988msgstr ""
    989989
    990 #: includes/class-landexhub-consent-admin.php:3055 includes/class-landexhub-consent-admin.php:3058
     990#: includes/class-landexhub-consent-admin.php:3063 includes/class-landexhub-consent-admin.php:3066
    991991msgid "Import settings"
    992992msgstr ""
    … …  
    10001000msgstr ""
    10011001
    1002 #: includes/class-landexhub-consent-admin.php:3500 includes/class-landexhub-consent-admin.php:4037
     1002#: includes/class-landexhub-consent-admin.php:3508 includes/class-landexhub-consent-admin.php:4054
    10031003msgid "In your list"
    10041004msgstr ""
    … …  
    10121012msgstr ""
    10131013
    1014 #: includes/class-landexhub-consent-admin.php:2933
     1014#: includes/class-landexhub-consent-admin.php:2941
    10151015msgid "Install it"
    10161016msgstr ""
    10171017
    1018 #: includes/class-landexhub-consent-admin.php:2686
     1018#: includes/class-landexhub-consent-admin.php:2692
    10191019msgid "Install WP Consent API"
    10201020msgstr ""
    10211021
    1022 #: includes/class-landexhub-consent-admin.php:1595 includes/class-landexhub-consent-admin.php:3123 includes/class-landexhub-consent-admin.php:3278 includes/class-landexhub-consent-admin.php:4328 includes/class-landexhub-consent-integrations.php:478 includes/class-landexhub-consent-log-admin.php:219 includes/class-landexhub-consent-log-admin.php:416 includes/class-landexhub-consent-log-admin.php:441 includes/class-landexhub-consent-services.php:531 includes/class-landexhub-consent-services.php:582 includes/class-landexhub-consent-texts.php:213
     1022#: includes/class-landexhub-consent-admin.php:1595 includes/class-landexhub-consent-admin.php:3131 includes/class-landexhub-consent-admin.php:3286 includes/class-landexhub-consent-admin.php:4363 includes/class-landexhub-consent-integrations.php:478 includes/class-landexhub-consent-log-admin.php:219 includes/class-landexhub-consent-log-admin.php:416 includes/class-landexhub-consent-log-admin.php:441 includes/class-landexhub-consent-services.php:531 includes/class-landexhub-consent-services.php:582 includes/class-landexhub-consent-texts.php:213
    10231023msgid "Insufficient permissions."
    10241024msgstr ""
    … …  
    10281028msgstr ""
    10291029
    1030 #: includes/class-landexhub-consent-admin.php:4237
     1030#: includes/class-landexhub-consent-admin.php:4272
    10311031msgid "Is LandexHub Consent and the measurement on this site set up correctly?"
    10321032msgstr ""
    10331033
    1034 #: includes/class-landexhub-consent-admin.php:2680
     1034#: includes/class-landexhub-consent-admin.php:2686
    10351035msgid "It grants nothing before consent, so it agrees with the LandexHub Consent default and nothing needs to change."
    10361036msgstr ""
    10371037
    1038 #: includes/class-landexhub-consent-admin.php:2922
     1038#: includes/class-landexhub-consent-admin.php:2930
    10391039msgid "It is part of LandexHub Consent itself."
    10401040msgstr ""
    10411041
    1042 #: includes/class-landexhub-consent-admin.php:2653
     1042#: includes/class-landexhub-consent-admin.php:2659
    10431043msgid "It sends its own Consent Mode default after ours and sets these signals to granted:"
    10441044msgstr ""
    … …  
    10561056msgstr ""
    10571057
    1058 #: includes/class-landexhub-consent-admin.php:2684
     1058#: includes/class-landexhub-consent-admin.php:2690
    10591059msgid "Its own Consent Mode reads the visitor's decision from the WP Consent API, which is not installed. Its Google tag still follows the Consent Mode signals LandexHub Consent sends."
    10601060msgstr ""
    … …  
    10681068msgstr ""
    10691069
    1070 #: includes/class-landexhub-consent-admin.php:3479 includes/class-landexhub-consent-admin.php:3964
     1070#: includes/class-landexhub-consent-admin.php:3487 includes/class-landexhub-consent-admin.php:3981
    10711071msgid "Known data"
    10721072msgstr ""
    10731073
    1074 #: includes/class-landexhub-consent-admin.php:3788
     1074#: includes/class-landexhub-consent-admin.php:3801
    10751075msgid "LandexHub also makes a separate, optional add-on for this plugin. Everything on these screens works without it."
    10761076msgstr ""
    … …  
    10801080msgstr ""
    10811081
    1082 #: includes/class-landexhub-consent-admin.php:3914 includes/class-landexhub-consent-admin.php:4145
     1082#: includes/class-landexhub-consent-admin.php:3929 includes/class-landexhub-consent-admin.php:4180
    10831083msgid "LandexHub Consent (your measurement ID)"
    10841084msgstr ""
    … …  
    10881088msgstr ""
    10891089
    1090 #: includes/class-landexhub-consent-admin.php:2744
     1090#: includes/class-landexhub-consent-admin.php:2750
    10911091msgid "LandexHub Consent does not block tags that other plugins add. To hold them back, gate them by hand or turn off their own Google tags."
    10921092msgstr ""
    10931093
    1094 #: includes/class-landexhub-consent-admin.php:2665
     1094#: includes/class-landexhub-consent-admin.php:2671
    10951095msgid "LandexHub Consent does not overwrite it — set that default to denied in the plugin, or turn its Consent Mode off."
    10961096msgstr ""
    … …  
    11011101msgstr ""
    11021102
    1103 #: includes/class-landexhub-consent-admin.php:2937
     1103#: includes/class-landexhub-consent-admin.php:2945
    11041104msgid "LandexHub Consent has no way to pass consent to this plugin, so it leaves it alone. Gate its scripts by hand instead."
    11051105msgstr ""
    … …  
    11091109msgstr ""
    11101110
    1111 #: includes/class-landexhub-consent-admin.php:4175
     1111#: includes/class-landexhub-consent-admin.php:4210
    11121112msgid "LandexHub Consent inserts the tag itself, right after its own Consent Mode default."
    11131113msgstr ""
    … …  
    11171117msgstr ""
    11181118
    1119 #: includes/class-landexhub-consent-admin.php:4277
     1119#: includes/class-landexhub-consent-admin.php:4312
    11201120msgid "LandexHub Consent provides the technical layer — legal responsibility for compliance stays with the site owner."
    11211121msgstr ""
    … …  
    11471147
    11481148#. translators: %s: human-readable time difference, e.g. "4 mins".
    1149 #: includes/class-landexhub-consent-admin.php:4072
     1149#: includes/class-landexhub-consent-admin.php:4089
    11501150msgid "Last site check: %s ago."
    11511151msgstr ""
    11521152
    1153 #: includes/class-landexhub-consent-admin.php:3789
     1153#: includes/class-landexhub-consent-admin.php:3802
    11541154msgid "Learn more"
    11551155msgstr ""
    … …  
    11721172msgstr ""
    11731173
    1174 #: includes/class-landexhub-consent-admin.php:3665
     1174#: includes/class-landexhub-consent-admin.php:3678
    11751175msgid "Looks almost the same. Needed for every video separately."
    11761176msgstr ""
    … …  
    11811181msgstr ""
    11821182
     1183#: includes/class-landexhub-consent-admin.php:2589
     1184msgid "marked, but a pixel needs data-cnsx-pixel, data-consent-category and its address in data-src"
     1185msgstr ""
     1186
    11831187#: includes/class-landexhub-consent-admin.php:2586
    1184 msgid "marked, but a pixel needs data-cnsx-pixel, data-consent-category and its address in data-src"
    1185 msgstr ""
    1186 
    1187 #: includes/class-landexhub-consent-admin.php:2583
    11881188msgid "marked, but the address is still in src (move it to data-src)"
    11891189msgstr ""
    11901190
    1191 #: includes/class-landexhub-consent-admin.php:2584
     1191#: includes/class-landexhub-consent-admin.php:2587
    11921192msgid "marked, but type=\"text/plain\" is missing"
    11931193msgstr ""
    11941194
    1195 #: includes/class-landexhub-consent-admin.php:2585
     1195#: includes/class-landexhub-consent-admin.php:2588
    11961196msgid "marked, but without a valid category (analytics, marketing or preferences)"
    11971197msgstr ""
    11981198
    1199 #: includes/class-landexhub-consent-admin.php:3607 includes/class-landexhub-consent-admin.php:3700 includes/class-landexhub-consent-services.php:53
     1199#: includes/class-landexhub-consent-admin.php:3620 includes/class-landexhub-consent-admin.php:3713 includes/class-landexhub-consent-services.php:53
    12001200msgid "Marketing"
    12011201msgstr ""
    … …  
    12091209msgstr ""
    12101210
    1211 #: includes/class-landexhub-consent-admin.php:3658
     1211#: includes/class-landexhub-consent-admin.php:3671
    12121212msgid "Marking the tag does not hold back an <iframe>. With its address left in src it loads before consent; with the address moved to data-src it does not load, but LandexHub Consent revives only <script> and cannot start it after consent either."
    12131213msgstr ""
    … …  
    12301230msgstr ""
    12311231
    1232 #: includes/class-landexhub-consent-admin.php:4309
     1232#: includes/class-landexhub-consent-admin.php:4344
    12331233msgid "Measurement IDs (GTM / gtag) live on the Services page — that is where measurement is added and changed."
    12341234msgstr ""
    … …  
    12581258msgstr ""
    12591259
    1260 #: includes/class-landexhub-consent-services.php:51
     1260#: includes/class-landexhub-consent-admin.php:2529 includes/class-landexhub-consent-admin.php:3529 includes/class-landexhub-consent-admin.php:4123 includes/class-landexhub-consent-services.php:51
    12611261msgid "Necessary"
    12621262msgstr ""
    … …  
    12661266msgstr ""
    12671267
     1268#: includes/class-landexhub-consent-admin.php:3936
     1269msgid "Necessary — it runs for every visitor, there is nothing to hold back"
     1270msgstr ""
     1271
     1272#: includes/class-landexhub-consent-admin.php:4146
     1273msgid "Necessary — it runs for every visitor, there is nothing to hold back."
     1274msgstr ""
     1275
    12681276#: includes/class-landexhub-consent-admin.php:631
    12691277msgid "Necessary — name"
    … …  
    12741282msgstr ""
    12751283
    1276 #: includes/class-landexhub-consent-admin.php:2931
     1284#: includes/class-landexhub-consent-admin.php:2939
    12771285msgid "Needs the free WP Consent API plugin — that is the channel it listens on."
    12781286msgstr ""
    … …  
    12821290msgstr ""
    12831291
    1284 #: includes/class-landexhub-consent-admin.php:4263
     1292#: includes/class-landexhub-consent-admin.php:4298
    12851293msgid "No issues found so far"
    12861294msgstr ""
    12871295
    1288 #: includes/class-landexhub-consent-admin.php:2730
     1296#: includes/class-landexhub-consent-admin.php:2736
    12891297msgid "No other Google tag was found in the front page HTML or from a known plugin, so Basic mode covers the Google tags found: the gtag.js that LandexHub Consent loads does not load before consent."
    12901298msgstr ""
    … …  
    13141322msgstr ""
    13151323
    1316 #: includes/class-landexhub-consent-admin.php:2913
     1324#: includes/class-landexhub-consent-admin.php:2921
    13171325msgid "None known"
    13181326msgstr ""
    … …  
    13271335msgstr ""
    13281336
    1329 #: includes/class-landexhub-consent-admin.php:2430 includes/class-landexhub-consent-admin.php:4152
     1337#: includes/class-landexhub-consent-admin.php:2430 includes/class-landexhub-consent-admin.php:4187
    13301338msgid "Not clear yet"
    13311339msgstr ""
    13321340
    1333 #: includes/class-landexhub-consent-admin.php:3523 includes/class-landexhub-consent-admin.php:4095
     1341#: includes/class-landexhub-consent-admin.php:3533 includes/class-landexhub-consent-admin.php:4126
    13341342msgid "Not governed yet"
    13351343msgstr ""
    13361344
    1337 #: includes/class-landexhub-consent-admin.php:3923
     1345#: includes/class-landexhub-consent-admin.php:3940
    13381346msgid "Not governed yet — the guide below shows how to gate it."
    13391347msgstr ""
    13401348
    1341 #: includes/class-landexhub-consent-admin.php:2970
     1349#: includes/class-landexhub-consent-admin.php:2978
    13421350msgid "Not tested by LandexHub; check it on your site."
    13431351msgstr ""
    13441352
    1345 #: includes/class-landexhub-consent-admin.php:4019
     1353#: includes/class-landexhub-consent-admin.php:4036
    13461354msgid "Note"
    13471355msgstr ""
    … …  
    13511359msgstr ""
    13521360
    1353 #: includes/class-landexhub-consent-admin.php:2568
     1361#: includes/class-landexhub-consent-admin.php:2571
    13541362msgid "nothing governs it"
    13551363msgstr ""
    13561364
    1357 #: includes/class-landexhub-consent-admin.php:4119
     1365#: includes/class-landexhub-consent-admin.php:4154
    13581366msgid "Nothing holds it back yet — the detail shows how to gate it."
    13591367msgstr ""
    … …  
    13671375msgstr ""
    13681376
    1369 #: includes/class-landexhub-consent-admin.php:4196
     1377#: includes/class-landexhub-consent-admin.php:4231
    13701378msgid "Nothing to set up here: their Google tags follow the Consent Mode signals LandexHub Consent sends. Consent integrations shows what was found on this site."
    13711379msgstr ""
    13721380
    1373 #: includes/class-landexhub-consent-admin.php:2921
     1381#: includes/class-landexhub-consent-admin.php:2929
    13741382msgid "Nothing to switch."
    13751383msgstr ""
    13761384
    13771385#. translators: %s: comma-separated list of problems.
    1378 #: includes/class-landexhub-consent-admin.php:3161 includes/class-landexhub-consent-admin.php:3230
     1386#: includes/class-landexhub-consent-admin.php:3169 includes/class-landexhub-consent-admin.php:3238
    13791387msgid "Nothing was imported. Problems found: %s"
    13801388msgstr ""
    13811389
    1382 #: includes/class-landexhub-consent-admin.php:2771
     1390#: includes/class-landexhub-consent-admin.php:2777
    13831391msgid "Nothing was saved — the service data was not valid (name, category or URL patterns)."
    13841392msgstr ""
    … …  
    13881396msgstr ""
    13891397
    1390 #: includes/class-landexhub-consent-admin.php:2962
     1398#: includes/class-landexhub-consent-admin.php:2970
    13911399msgid "Off — the plugin decides on its own."
    13921400msgstr ""
    … …  
    14201428msgstr ""
    14211429
    1422 #: includes/class-landexhub-consent-admin.php:2962
     1430#: includes/class-landexhub-consent-admin.php:2970
    14231431msgid "On — the plugin follows the visitor."
    14241432msgstr ""
    14251433
    1426 #: includes/class-landexhub-consent-admin.php:2845
     1434#: includes/class-landexhub-consent-admin.php:2853
    14271435msgid "One or the other, never both — two containers measure everything twice. Neither is mandatory."
    14281436msgstr ""
    14291437
    14301438#. translators: 1: gated occurrences, 2: all occurrences.
    1431 #: includes/class-landexhub-consent-admin.php:2540
     1439#: includes/class-landexhub-consent-admin.php:2543
    14321440msgid "only %1$d of %2$d occurrences are gated"
    14331441msgstr ""
    14341442
    1435 #: includes/class-landexhub-consent-admin.php:2895
     1443#: includes/class-landexhub-consent-admin.php:2903
    14361444msgid "Only plugins actually running here. Their tags stay theirs — LandexHub Consent just passes on what the visitor chose."
    14371445msgstr ""
    14381446
    1439 #: includes/class-landexhub-consent-admin.php:4115
     1447#: includes/class-landexhub-consent-admin.php:4150
    14401448msgid "Only some of its copies are held back; another one still loads before consent."
    14411449msgstr ""
    … …  
    14451453msgstr ""
    14461454
    1447 #: includes/class-landexhub-consent-admin.php:2638 includes/class-landexhub-consent-admin.php:2956
     1455#: includes/class-landexhub-consent-admin.php:2644 includes/class-landexhub-consent-admin.php:2964
    14481456msgid "Open settings"
    14491457msgstr ""
    … …  
    14531461msgstr ""
    14541462
    1455 #: includes/class-landexhub-consent-admin.php:4290
     1463#: includes/class-landexhub-consent-admin.php:4325
    14561464msgid "Open the consent log records"
    14571465msgstr ""
    14581466
    1459 #: includes/class-landexhub-consent-admin.php:3379
     1467#: includes/class-landexhub-consent-admin.php:3387
    14601468msgid "Open the Google settings"
    14611469msgstr ""
    … …  
    14811489msgstr ""
    14821490
    1483 #: includes/class-landexhub-consent-admin.php:4095
     1491#: includes/class-landexhub-consent-admin.php:4126
    14841492msgid "Partly governed"
    14851493msgstr ""
    14861494
    1487 #: includes/class-landexhub-consent-admin.php:2904
     1495#: includes/class-landexhub-consent-admin.php:2912
    14881496msgid "Pass consent"
    14891497msgstr ""
    … …  
    14941502
    14951503#. translators: %s: plugin name.
    1496 #: includes/class-landexhub-consent-admin.php:2948
     1504#: includes/class-landexhub-consent-admin.php:2956
    14971505msgid "Pass the visitor's decision to %s"
    14981506msgstr ""
    … …  
    15141522msgstr ""
    15151523
    1516 #: includes/class-landexhub-consent-admin.php:2902
     1524#: includes/class-landexhub-consent-admin.php:2910
    15171525msgid "Plugin"
    15181526msgstr ""
    15191527
    1520 #: includes/class-landexhub-consent-admin.php:3608 includes/class-landexhub-consent-admin.php:3701
     1528#: includes/class-landexhub-consent-admin.php:3621 includes/class-landexhub-consent-admin.php:3714
    15211529msgid "Preferences"
    15221530msgstr ""
    … …  
    15261534msgstr ""
    15271535
    1528 #: includes/class-landexhub-consent-admin.php:3534 includes/class-landexhub-consent-admin.php:3976 includes/class-landexhub-consent-frontend.php:284 includes/class-landexhub-consent-frontend.php:305
     1536#: includes/class-landexhub-consent-admin.php:3544 includes/class-landexhub-consent-admin.php:3993 includes/class-landexhub-consent-frontend.php:284 includes/class-landexhub-consent-frontend.php:305
    15291537msgid "Privacy policy"
    15301538msgstr ""
    … …  
    15501558msgstr ""
    15511559
    1552 #: includes/class-landexhub-consent-admin.php:3864
     1560#: includes/class-landexhub-consent-admin.php:3877
    15531561msgid "Re-check the site"
    15541562msgstr ""
    … …  
    15581566msgstr ""
    15591567
    1560 #: includes/class-landexhub-consent-admin.php:3011
     1568#: includes/class-landexhub-consent-admin.php:3019
    15611569msgid "Record of granted, rejected and changed consents."
    15621570msgstr ""
    … …  
    15781586msgstr ""
    15791587
    1580 #: includes/class-landexhub-consent-admin.php:3712
     1588#: includes/class-landexhub-consent-admin.php:3725
    15811589msgid "Remove from the list"
    15821590msgstr ""
    … …  
    15861594msgstr ""
    15871595
    1588 #: includes/class-landexhub-consent-admin.php:2767
     1596#: includes/class-landexhub-consent-admin.php:2773
    15891597msgid "Removed from the services list."
    15901598msgstr ""
    15911599
    1592 #: includes/class-landexhub-consent-admin.php:3664
     1600#: includes/class-landexhub-consent-admin.php:3677
    15931601msgid "Replace it with a linked preview image"
    15941602msgstr ""
    15951603
    1596 #: includes/class-landexhub-consent-admin.php:3662
     1604#: includes/class-landexhub-consent-admin.php:3675
    15971605msgid "Replace the video with a link"
    15981606msgstr ""
    15991607
    1600 #: includes/class-landexhub-consent-admin.php:3039 includes/class-landexhub-consent-admin.php:3042
     1608#: includes/class-landexhub-consent-admin.php:3047 includes/class-landexhub-consent-admin.php:3050
    16011609msgid "Reset consents"
    16021610msgstr ""
    … …  
    16071615
    16081616#. translators: %d: consent revision number.
    1609 #: includes/class-landexhub-consent-admin.php:3044
     1617#: includes/class-landexhub-consent-admin.php:3052
    16101618msgid "Revision %d"
    16111619msgstr ""
    … …  
    16191627msgstr ""
    16201628
    1621 #: includes/class-landexhub-consent-admin.php:2851 includes/class-landexhub-consent-admin.php:2996
     1629#: includes/class-landexhub-consent-admin.php:2529
     1630msgid "runs for every visitor, there is nothing to hold back"
     1631msgstr ""
     1632
     1633#: includes/class-landexhub-consent-admin.php:2859 includes/class-landexhub-consent-admin.php:3004
    16221634msgid "Save"
    16231635msgstr ""
    … …  
    16401652msgstr ""
    16411653
    1642 #: includes/class-landexhub-consent-admin.php:3688
     1654#: includes/class-landexhub-consent-admin.php:3701
    16431655msgid "Save the source to your services list so it appears on your cookie policy page under the chosen category. The list documents the source; gating is done by the steps above."
    16441656msgstr ""
    16451657
    1646 #: includes/class-landexhub-consent-admin.php:3716
     1658#: includes/class-landexhub-consent-admin.php:3729
    16471659msgid "Save to the services list"
    16481660msgstr ""
    16491661
    1650 #: includes/class-landexhub-consent-admin.php:2763
     1662#: includes/class-landexhub-consent-admin.php:2769
    16511663msgid "Saved to the services list."
    16521664msgstr ""
    … …  
    16601672msgstr ""
    16611673
    1662 #: includes/class-landexhub-consent-admin.php:3475 includes/class-landexhub-consent-admin.php:4016 includes/class-landexhub-consent-frontend.php:301
     1674#: includes/class-landexhub-consent-admin.php:3483 includes/class-landexhub-consent-admin.php:4033 includes/class-landexhub-consent-frontend.php:301
    16631675msgid "Service"
    16641676msgstr ""
    16651677
    1666 #: includes/class-landexhub-consent-admin.php:3469
     1678#: includes/class-landexhub-consent-admin.php:3477
    16671679msgid "Service inventory"
    16681680msgstr ""
    16691681
    1670 #: includes/class-landexhub-consent-admin.php:128 includes/class-landexhub-consent-admin.php:2045 includes/class-landexhub-consent-admin.php:3755 includes/class-landexhub-consent-admin.php:3887
     1682#: includes/class-landexhub-consent-admin.php:128 includes/class-landexhub-consent-admin.php:2045 includes/class-landexhub-consent-admin.php:3768 includes/class-landexhub-consent-admin.php:3903
    16711683msgid "Services"
    16721684msgstr ""
    16731685
    1674 #: includes/class-landexhub-consent-admin.php:3686
     1686#: includes/class-landexhub-consent-admin.php:3699
    16751687msgid "Services list"
    16761688msgstr ""
    … …  
    16881700msgstr ""
    16891701
    1690 #: includes/class-landexhub-consent-admin.php:3290
     1702#: includes/class-landexhub-consent-admin.php:3298
    16911703msgid "Settings imported."
    16921704msgstr ""
    … …  
    17281740
    17291741#. translators: %s: comma-separated list of setting keys.
    1730 #: includes/class-landexhub-consent-admin.php:3345
     1742#: includes/class-landexhub-consent-admin.php:3353
    17311743msgid "Some values were not valid and were not saved: %s. The previous values were kept."
    17321744msgstr ""
    17331745
    1734 #: includes/class-landexhub-consent-admin.php:4223
     1746#: includes/class-landexhub-consent-admin.php:4258
    17351747msgid "Something missing? The check reads the front page; a source that loads only on a subpage does not show up here."
    17361748msgstr ""
    17371749
    1738 #: includes/class-landexhub-consent-admin.php:2327 includes/class-landexhub-consent-admin.php:3945
     1750#: includes/class-landexhub-consent-admin.php:2327 includes/class-landexhub-consent-admin.php:3962
    17391751msgid "Source"
    17401752msgstr ""
    … …  
    17481760msgstr ""
    17491761
    1750 #: includes/class-landexhub-consent-admin.php:3943
     1762#: includes/class-landexhub-consent-admin.php:3960
    17511763msgid "Sources on this site"
    17521764msgstr ""
    17531765
    1754 #: includes/class-landexhub-consent-admin.php:3905 includes/class-landexhub-consent-admin.php:4018
     1766#: includes/class-landexhub-consent-admin.php:3920 includes/class-landexhub-consent-admin.php:4035
    17551767msgid "Status"
    17561768msgstr ""
    … …  
    17731785msgstr ""
    17741786
    1775 #: includes/class-landexhub-consent-admin.php:4306
     1787#: includes/class-landexhub-consent-admin.php:4341
    17761788msgid "Technical settings most sites never need to change. The defaults work without visiting this page."
    17771789msgstr ""
    … …  
    18141826msgstr ""
    18151827
    1816 #: includes/class-landexhub-consent-admin.php:4183
     1828#: includes/class-landexhub-consent-admin.php:4218
    18171829msgid "The container manages all Google tags. LandexHub Consent inserts it and hands it the consent first."
    18181830msgstr ""
    … …  
    18261838msgstr ""
    18271839
    1828 #: includes/class-landexhub-consent-admin.php:3246
     1840#: includes/class-landexhub-consent-admin.php:3254
    18291841msgid "the file is not a JSON export of this plugin"
    18301842msgstr ""
    18311843
    1832 #: includes/class-landexhub-consent-admin.php:3249
     1844#: includes/class-landexhub-consent-admin.php:3257
    18331845msgid "the file is not a settings export of LandexHub Consent"
    18341846msgstr ""
    … …  
    18421854msgstr ""
    18431855
    1844 #: includes/class-landexhub-consent-admin.php:2261 includes/class-landexhub-consent-admin.php:4007 includes/class-landexhub-consent-admin.php:4078
     1856#: includes/class-landexhub-consent-admin.php:2261 includes/class-landexhub-consent-admin.php:4024 includes/class-landexhub-consent-admin.php:4095
    18451857msgid "The front page could not be loaded, so it could not be checked. Try again in a moment."
    18461858msgstr ""
    … …  
    18601872
    18611873#. translators: %s: what went wrong.
    1862 #: includes/class-landexhub-consent-admin.php:3228
     1874#: includes/class-landexhub-consent-admin.php:3236
    18631875msgid "The import was only partly applied: %s. Check the settings and the services list."
    18641876msgstr ""
    18651877
    1866 #: includes/class-landexhub-consent-admin.php:3619
     1878#: includes/class-landexhub-consent-admin.php:3632
    18671879msgid "the original script body stays unchanged"
    18681880msgstr ""
    … …  
    18971909msgstr ""
    18981910
    1899 #: includes/class-landexhub-consent-admin.php:3178
     1911#: includes/class-landexhub-consent-admin.php:3186
    19001912msgid "the services could not be stored"
    19011913msgstr ""
    … …  
    19091921msgstr ""
    19101922
    1911 #: includes/class-landexhub-consent-admin.php:3189
     1923#: includes/class-landexhub-consent-admin.php:3197
    19121924msgid "the settings could not be stored"
    19131925msgstr ""
    19141926
    1915 #: includes/class-landexhub-consent-admin.php:3187
     1927#: includes/class-landexhub-consent-admin.php:3195
    19161928msgid "the settings could not be stored and the previous services list could not be restored, so the imported services are in use with the previous settings"
    19171929msgstr ""
    … …  
    19221934msgstr ""
    19231935
    1924 #: includes/class-landexhub-consent-admin.php:4216
     1936#: includes/class-landexhub-consent-admin.php:4251
    19251937msgid "The site check found no measurement. The consent bar works without it — you do not have to add anything."
    19261938msgstr ""
    19271939
    1928 #: includes/class-landexhub-consent-admin.php:4260
     1940#: includes/class-landexhub-consent-admin.php:4295
    19291941msgid "the specific steps are with each issue below."
    19301942msgstr ""
    19311943
    19321944#. translators: %s: Universal Analytics ID, e.g. UA-12345-1.
    1933 #: includes/class-landexhub-consent-admin.php:3375
     1945#: includes/class-landexhub-consent-admin.php:3383
    19341946msgid "The stored measurement ID %s is a Universal Analytics ID. Google no longer processes Universal Analytics data, so LandexHub Consent does not load it. Enter a Google Analytics 4 ID (G-…) instead, or choose “Nothing” to remove it."
    19351947msgstr ""
    19361948
    1937 #: includes/class-landexhub-consent-admin.php:2738
     1949#: includes/class-landexhub-consent-admin.php:2744
    19381950msgid "The switch only controls the gtag.js that LandexHub Consent loads. These load regardless of it:"
    19391951msgstr ""
    … …  
    19471959msgstr ""
    19481960
    1949 #: includes/class-landexhub-consent-admin.php:3143
     1961#: includes/class-landexhub-consent-admin.php:3151
    19501962msgid "the uploaded file could not be read"
    19511963msgstr ""
    19521964
    1953 #: includes/class-landexhub-consent-admin.php:3663
     1965#: includes/class-landexhub-consent-admin.php:3676
    19541966msgid "The visitor leaves for the service; nothing loads on your site."
    19551967msgstr ""
    … …  
    19631975msgstr ""
    19641976
    1965 #: includes/class-landexhub-consent-admin.php:3890
     1977#: includes/class-landexhub-consent-admin.php:3906
    19661978msgid "This service is not on the list any more."
    19671979msgstr ""
    19681980
    1969 #: includes/class-landexhub-consent-admin.php:4215
     1981#: includes/class-landexhub-consent-admin.php:4250
    19701982msgid "This site does not measure anything yet"
    19711983msgstr ""
    … …  
    19751987msgstr ""
    19761988
    1977 #: includes/class-landexhub-consent-admin.php:3692
     1989#: includes/class-landexhub-consent-admin.php:3705
    19781990msgid "This source is already in your services list — saving updates the entry."
    19791991msgstr ""
    … …  
    19871999msgstr ""
    19882000
    1989 #: includes/class-landexhub-consent-admin.php:3029
     2001#: includes/class-landexhub-consent-admin.php:3037
    19902002msgid "Tools"
    19912003msgstr ""
    … …  
    20162028msgstr ""
    20172029
    2018 #: includes/class-landexhub-consent-admin.php:4057 includes/class-landexhub-consent-admin.php:4092
     2030#: includes/class-landexhub-consent-admin.php:4074 includes/class-landexhub-consent-admin.php:4120
    20192031msgid "Unassigned"
    20202032msgstr ""
    20212033
    2022 #: includes/class-landexhub-consent-admin.php:4053
     2034#: includes/class-landexhub-consent-admin.php:4070
    20232035msgid "Unassigned — not in the catalog or in your services list"
    20242036msgstr ""
    … …  
    20322044msgstr ""
    20332045
    2034 #: includes/class-landexhub-consent-admin.php:2991
     2046#: includes/class-landexhub-consent-admin.php:2999
    20352047msgid "Until WP Consent API is installed nothing changes — those plugins keep behaving exactly as they do now."
    20362048msgstr ""
    … …  
    20412053msgstr ""
    20422054
    2043 #: includes/class-landexhub-consent-admin.php:3666
     2055#: includes/class-landexhub-consent-admin.php:3679
    20442056msgid "Use a click-to-load plugin"
    20452057msgstr ""
    20462058
    20472059#. translators: %s: the container or measurement ID that stays active.
    2048 #: includes/class-landexhub-consent-admin.php:3440
     2060#: includes/class-landexhub-consent-admin.php:3448
    20492061msgid "Use either a GTM container or a gtag.js ID, not both — two containers would measure everything twice. Keeping %s and clearing the other field."
    20502062msgstr ""
    … …  
    20542066msgstr ""
    20552067
    2056 #: includes/class-landexhub-consent-admin.php:4195
     2068#: includes/class-landexhub-consent-admin.php:4230
    20572069msgid "Using Site Kit or MonsterInsights?"
    20582070msgstr ""
    … …  
    20622074msgstr ""
    20632075
    2064 #: includes/class-landexhub-consent-admin.php:3623
     2076#: includes/class-landexhub-consent-admin.php:3636
    20652077msgid "Verify the edit"
    20662078msgstr ""
    … …  
    20862098msgstr ""
    20872099
    2088 #: includes/class-landexhub-consent-admin.php:995 includes/class-landexhub-consent-admin.php:2844
     2100#: includes/class-landexhub-consent-admin.php:995 includes/class-landexhub-consent-admin.php:2852
    20892101msgid "What LandexHub Consent adds to the site"
    20902102msgstr ""
    … …  
    20942106msgstr ""
    20952107
    2096 #: includes/class-landexhub-consent-admin.php:3756 includes/class-landexhub-consent-admin.php:3901
     2108#: includes/class-landexhub-consent-admin.php:3769 includes/class-landexhub-consent-admin.php:3916
    20972109msgid "What this site uses and how consent governs it."
    20982110msgstr ""
    … …  
    21022114msgstr ""
    21032115
    2104 #: includes/class-landexhub-consent-admin.php:2328 includes/class-landexhub-consent-admin.php:3946
     2116#: includes/class-landexhub-consent-admin.php:2328 includes/class-landexhub-consent-admin.php:3963
    21052117msgid "Who adds it"
    21062118msgstr ""
    21072119
    2108 #: includes/class-landexhub-consent-admin.php:2894
     2120#: includes/class-landexhub-consent-admin.php:2902
    21092121msgid "Who LandexHub Consent passes consent to"
    21102122msgstr ""
    … …  
    21312143msgstr ""
    21322144
    2133 #: includes/class-landexhub-consent-admin.php:2980
     2145#: includes/class-landexhub-consent-admin.php:2988
    21342146msgid "WP Consent API is a shared channel: while it is installed, LandexHub Consent is the consent manager for every plugin here that reads it."
    21352147msgstr ""
    21362148
    2137 #: includes/class-landexhub-consent-admin.php:2382 includes/class-landexhub-consent-admin.php:2557
     2149#: includes/class-landexhub-consent-admin.php:2382 includes/class-landexhub-consent-admin.php:2560
    21382150msgid "written into the page"
    21392151msgstr ""
    … …  
    21432155msgstr ""
    21442156
    2145 #: includes/class-landexhub-consent-admin.php:4185
     2157#: includes/class-landexhub-consent-admin.php:4220
    21462158msgid "You will find the ID in Tag Manager, top right."
    21472159msgstr ""
    21482160
    2149 #: includes/class-landexhub-consent-admin.php:2710
     2161#: includes/class-landexhub-consent-admin.php:2716
    21502162msgid "your GTM container — it always loads; what each tag does before consent is decided in GTM"
    21512163msgstr ""
  • landexhub-consent/tags/0.9.3/readme.txt

    r3758640 r3762168  
    55Tested up to: 7.1
    66Requires PHP: 7.4
    7 Stable tag: 0.9.2
     7Stable tag: 0.9.3
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
    … …  
    4646This plugin does not call home and sends no telemetry. Depending on what **you** configure, it talks to the following services:
    4747
    48 **Google Tag Manager / Google tag (gtag.js)** — optional, disabled by default. If you enter your own GTM container ID or gtag.js measurement ID in the plugin settings, the plugin embeds the standard Google snippet, and every visitor's browser then loads the tag from `www.googletagmanager.com` (requests `gtm.js` or `gtag/js`). This is required for the measurement you configured to work. The plugin prints the Google Consent Mode v2 `denied` default before these tags, unless a developer turns that default off with the `landexhub_consent_emit_consent_default` filter. No `<noscript>` fallback is printed, so visitors without JavaScript load nothing from Google. What Google receives with those requests (IP address, user agent, page URL, consent state signals) is described in Google's documentation: [Google Terms of Service](https://policies.google.com/terms), [Google Privacy Policy](https://policies.google.com/privacy). If you leave the setting empty, nothing is loaded from Google by this plugin.
     48**Google Tag Manager / Google tag (gtag.js)** — optional, disabled by default. If you enter your own GTM container ID or gtag.js measurement ID in the plugin settings, the plugin embeds the standard Google snippet, and every visitor's browser then loads the tag from `www.googletagmanager.com` (requests `gtm.js` or `gtag/js`). This is required for the measurement you configured to work. The plugin prints the Google Consent Mode v2 `denied` default before these tags, unless a developer turns that default off with the `landexhub_consent_emit_consent_default` filter. With a GTM container the plugin also prints Google's `<noscript>` frame right after the opening `<body>` tag (in themes that call `wp_body_open()`), as in Google's installation instructions: visitors without JavaScript then load `ns.html` from `www.googletagmanager.com`. Without JavaScript there is no consent bar and no Consent Mode default, so that request carries no consent state. What Google receives with those requests (IP address, user agent, page URL, consent state signals) is described in Google's documentation: [Google Terms of Service](https://policies.google.com/terms), [Google Privacy Policy](https://policies.google.com/privacy). If you leave the setting empty, nothing is loaded from Google by this plugin.
    4949
    5050**Your own site (loopback)** — the site check fetches your own homepage over HTTP (a loopback request to your own server) to scan the HTML for third-party scripts and the Google tag order. No external service is involved.
    … …  
    119119== Changelog ==
    120120
     121= 0.9.3 =
     122* "Verify the edit" in the gating guide checks the site again and returns to the page you started from (the service detail or Services), not to a page that has no menu entry.
     123* A source saved to the services list from an inline snippet (for example the Meta Pixel) is matched to its catalog service, so it is listed once in Services and on the cookie policy page. Entries saved this way in 0.9.2 are now shown with their catalog service too.
     124* Services the catalog files as necessary (Stripe, PayPal, Google reCAPTCHA, Cloudflare Turnstile) are shown as "Necessary": they no longer count as needing attention, are not reported as loading before consent and are not offered for gating.
     125* Google tags follow Google's installation snippets: the GTM container also prints its `<noscript>` frame right after the opening `<body>` tag, and gtag.js in Advanced mode loads with `async`, followed by its config. The plugin's own tags only add an `id` attribute.
     126* The `landexhub_consent_update` dataLayer event now comes after GTM's `gtm.js` event whenever the container starts while the page loads, also when the theme or another plugin prints it after the LandexHub Consent script, so GTM triggers on it fire. A container that starts only after the page has loaded (for example one delayed by an optimisation plugin) still gets the event before `gtm.js`. The Consent Mode update with a returning visitor's choice still goes out at once, before the container's first tag.
     127
    121128= 0.9.2 =
    122129* The consent log retention is now a setting: keep records for 3 months up to 5 years, or until you delete them (default 12 months).
    … …  
    149156== Upgrade Notice ==
    150157
     158= 0.9.3 =
     159GTM triggers on the consent event fire wherever the container is printed in the page. Fixes in the Services page: "Verify the edit" returns to the service, no duplicate rows for inline sources, necessary services are not reported as problems.
     160
    151161= 0.9.2 =
    152162Configurable consent log retention, opt-in credit link and stricter settings validation.
  • landexhub-consent/tags/0.9.3/src/consent.ts

    r3758640 r3762168  
    427427    // that outlived the visitor's choice (it expired, or the cookie was removed).
    428428    pushWpConsent(state, "none" === source);
     429    // The signals go out at once, so GTM knows a returning visitor's choice before its first tag.
    429430    gtag("consent", "update", signals(state));
    430431    const ev: { [key: string]: unknown } = { event: cfg.dataLayer!.onUpdate };
    431432    ev.landexhub_consent = catBooleans(state);
    432433    ev.landexhub_consent_source = source;
    433     (w.dataLayer as unknown[]).push(ev);
     434    // The event is meant for GTM triggers, which never see an event that comes before GTM's
     435    // gtm.js. A page-load event usually does, a choice made in the bar only rarely.
     436    afterGtmStart(function () { (w.dataLayer as unknown[]).push(ev); });
     437  }
     438
     439  // Runs fn once the GTM container has started: right away when its gtm.js event is already
     440  // in the dataLayer, otherwise just after the GTM snippet pushes it, whether the snippet
     441  // comes before or after this script. Without GTM on the page fn runs once the page has
     442  // loaded, so other listeners still get the event.
     443  function afterGtmStart(fn: () => void): void {
     444    const dl = w.dataLayer as { [key: string]: unknown }[];
     445    const started = function (e: unknown): boolean {
     446      return !!e && typeof e === "object" && (e as { event?: unknown }).event === "gtm.js";
     447    };
     448    if (dl.some(started) || "complete" === d.readyState) {
     449      fn();
     450      return;
     451    }
     452    let done = false;
     453    const run = function (): void {
     454      if (done) return;
     455      done = true;
     456      if (dl.push === wrapped) dl.push = original;
     457      fn();
     458    };
     459    const original = dl.push;
     460    const wrapped = function (this: unknown, ...items: { [key: string]: unknown }[]): number {
     461      const n = original.apply(dl, items);
     462      if (!done && items.some(started)) run();
     463      return n;
     464    };
     465    dl.push = wrapped;
     466    w.addEventListener("load", run);
    434467  }
    435468  function persist(state: ConsentState): void {
  • landexhub-consent/trunk/assets/js/landexhub-consent.js

    r3758640 r3762168  
    368368        // that outlived the visitor's choice (it expired, or the cookie was removed).
    369369        pushWpConsent(state, "none" === source);
     370        // The signals go out at once, so GTM knows a returning visitor's choice before its first tag.
    370371        gtag("consent", "update", signals(state));
    371372        const ev = { event: cfg.dataLayer.onUpdate };
    372373        ev.landexhub_consent = catBooleans(state);
    373374        ev.landexhub_consent_source = source;
    374         w.dataLayer.push(ev);
     375        // The event is meant for GTM triggers, which never see an event that comes before GTM's
     376        // gtm.js. A page-load event usually does, a choice made in the bar only rarely.
     377        afterGtmStart(function () { w.dataLayer.push(ev); });
     378    }
     379    // Runs fn once the GTM container has started: right away when its gtm.js event is already
     380    // in the dataLayer, otherwise just after the GTM snippet pushes it, whether the snippet
     381    // comes before or after this script. Without GTM on the page fn runs once the page has
     382    // loaded, so other listeners still get the event.
     383    function afterGtmStart(fn) {
     384        const dl = w.dataLayer;
     385        const started = function (e) {
     386            return !!e && typeof e === "object" && e.event === "gtm.js";
     387        };
     388        if (dl.some(started) || "complete" === d.readyState) {
     389            fn();
     390            return;
     391        }
     392        let done = false;
     393        const run = function () {
     394            if (done)
     395                return;
     396            done = true;
     397            if (dl.push === wrapped)
     398                dl.push = original;
     399            fn();
     400        };
     401        const original = dl.push;
     402        const wrapped = function (...items) {
     403            const n = original.apply(dl, items);
     404            if (!done && items.some(started))
     405                run();
     406            return n;
     407        };
     408        dl.push = wrapped;
     409        w.addEventListener("load", run);
    375410    }
    376411    function persist(state) {
  • landexhub-consent/trunk/includes/class-landexhub-consent-admin.php

    r3758640 r3762168  
    15651565                        . '</h2><ul class="landexhub-consent-checklist">';
    15661566                foreach ( array_slice( $findings, 0, 6 ) as $f ) {
    1567                         $held  = ! empty( $f['managed'] ) || ! empty( $f['gated'] ) || ! empty( $f['google'] );
     1567                        $held  = ! empty( $f['managed'] ) || ! empty( $f['gated'] ) || ! empty( $f['google'] ) || ! empty( $f['necessary'] );
    15681568                        $ok    = $held && empty( $f['never_runs'] );
    15691569                        $label = '' !== $f['vendor'] ? $f['vendor'] : $f['label'];
    … …  
    24852485         */
    24862486        private function finding_governed( $f ) {
    2487                 return 'consent-mode' === $f['reason'] || ! empty( $f['gated'] );
     2487                return 'consent-mode' === $f['reason'] || ! empty( $f['gated'] ) || ! empty( $f['necessary'] );
    24882488        }
    24892489
    … …  
    25252525                if ( 'consent-mode' === $f['reason'] ) {
    25262526                        return $this->state_pill( true, __( 'Consent Mode v2 — tags inside a GTM container need their own consent settings', 'landexhub-consent' ) );
     2527                }
     2528                if ( ! empty( $f['necessary'] ) && empty( $f['gated'] ) ) {
     2529                        return $this->state_pill( true, __( 'runs for every visitor, there is nothing to hold back', 'landexhub-consent' ), __( 'Necessary', 'landexhub-consent' ) );
    25272530                }
    25282531                $problem = $this->gate_problem( $f );
    … …  
    26022605         * source, so it stays readable in grayscale and in `forced-colors` mode.
    26032606         *
    2604          * @param bool   $ok   Whether consent governs the source.
    2605          * @param string $note How it is governed (or why not).
     2607         * @param bool   $ok    Whether consent governs the source.
     2608         * @param string $note  How it is governed (or why not).
     2609         * @param string $label Pill text instead of the default one.
    26062610         * @return string HTML.
    26072611         */
    2608         private function state_pill( $ok, $note ) {
     2612        private function state_pill( $ok, $note, $label = '' ) {
    26092613                $class = $ok ? 'landexhub-consent-pill is-ok' : 'landexhub-consent-pill is-warn';
    2610                 $label = $ok ? __( 'Consent governs it', 'landexhub-consent' ) : __( 'Always loads', 'landexhub-consent' );
     2614                if ( '' === $label ) {
     2615                        $label = $ok ? __( 'Consent governs it', 'landexhub-consent' ) : __( 'Always loads', 'landexhub-consent' );
     2616                }
    26112617
    26122618                return '<span class="' . esc_attr( $class ) . '">' . esc_html( $label ) . '</span>'
    … …  
    28212827         *
    28222828         * @param string|null $page Target page (default Consent integrations).
     2829         * @param array       $args Further query arguments of the target page, e.g. the service of a detail.
    28232830         * @return string
    28242831         */
    2825         private function rescan_url( $page = null ) {
     2832        private function rescan_url( $page = null, array $args = array() ) {
    28262833                $page = null === $page ? self::PAGE_INTEGRATIONS : $page;
    2827                 return wp_nonce_url(
    2828                         admin_url( 'admin.php?page=' . $page . '&cnsx_rescan_sources=1' ),
    2829                         'landexhub_consent_rescan_sources'
    2830                 );
     2834                $url  = admin_url( 'admin.php?page=' . $page );
     2835                if ( $args ) {
     2836                        $url = add_query_arg( array_map( 'rawurlencode', $args ), $url );
     2837                }
     2838                return wp_nonce_url( add_query_arg( 'cnsx_rescan_sources', '1', $url ), 'landexhub_consent_rescan_sources' );
    28312839        }
    28322840
    … …  
    35183526                        // Whether consent governs the service.
    35193527                        echo '<td>';
    3520                         if ( $item['governed'] ) {
     3528                        if ( $this->item_necessary( $item ) ) {
     3529                                echo '<span class="landexhub-consent-pill is-ok">' . esc_html__( 'Necessary', 'landexhub-consent' ) . '</span>';
     3530                        } elseif ( $item['governed'] ) {
    35213531                                echo '<span class="landexhub-consent-pill is-ok">' . esc_html__( 'Consent governs it', 'landexhub-consent' ) . '</span>';
    35223532                        } else {
    … …  
    35573567         * part is never submitted together with the visible one.
    35583568         *
    3559          * @return void
    3560          */
    3561         public function render_scripts_help() {
     3569         * @param string $verify_url Where "Verify the edit" checks the site again and returns to:
     3570         *                           the page the dialog is on (default Consent integrations).
     3571         * @return void
     3572         */
     3573        public function render_scripts_help( $verify_url = '' ) {
    35623574                echo '<dialog class="landexhub-consent-dialog" id="landexhub-consent-gate-dialog">';
    35633575                echo '<div class="landexhub-consent-dialog__head">';
    … …  
    35793591                echo '</div>';
    35803592
    3581                 $this->gate_form_script();
     3593                $this->gate_form_script( '' !== $verify_url ? $verify_url : $this->rescan_url() );
    35823594                $this->gate_form_iframe();
    35833595
    … …  
    35893601         * and the option to save the source to the services list.
    35903602         *
    3591          * @return void
    3592          */
    3593         private function gate_form_script() {
     3603         * @param string $verify_url URL of the "Verify the edit" button.
     3604         * @return void
     3605         */
     3606        private function gate_form_script( $verify_url ) {
    35943607                echo '<form data-cnsx-part="script" hidden method="post" action="' . esc_url( admin_url( 'admin-post.php' ) ) . '">';
    35953608                wp_nonce_field( 'landexhub_consent_service' );
    … …  
    36213634                echo '</div>';
    36223635
    3623                 echo '<p><a class="button" href="' . esc_url( $this->rescan_url() ) . '">' . esc_html__( 'Verify the edit', 'landexhub-consent' ) . '</a></p>';
     3636                echo '<p><a class="button" href="' . esc_url( $verify_url ) . '">' . esc_html__( 'Verify the edit', 'landexhub-consent' ) . '</a></p>';
    36243637
    36253638                echo '<div class="landexhub-consent-notice-warn">'
    … …  
    37723785
    37733786                                $this->add_measurement_dialog();
    3774                                 $this->render_scripts_help();
     3787                                $this->render_scripts_help( $this->rescan_url( self::PAGE_SERVICES ) );
    37753788                                $this->addon_note();
    37763789                        },
    … …  
    38783891                require_once LANDEXHUB_CONSENT_PLUGIN_DIR . 'includes/class-landexhub-consent-services.php';
    38793892                require_once LANDEXHUB_CONSENT_PLUGIN_DIR . 'includes/class-landexhub-consent-frontend.php';
    3880 
     3893                require_once LANDEXHUB_CONSENT_PLUGIN_DIR . 'includes/class-landexhub-consent-scan.php';
     3894
     3895                // "Verify the edit" comes back here with a new check of the front page.
     3896                $scan  = LandexHub_Consent_Scan::run( $this->consume_rescan() );
    38813897                $items = LandexHub_Consent_Inventory::items();
    38823898                $back  = admin_url( 'admin.php?page=' . self::PAGE_SERVICES );
    … …  
    38953911                }
    38963912                $item = $items[ $id ];
    3897                 $scan = LandexHub_Consent_Scan::run( false );
    38983913
    38993914                $this->shell(
    … …  
    39183933                                }
    39193934
    3920                                 if ( ! empty( $item['governed'] ) || $is_configured ) {
     3935                                if ( $this->item_necessary( $item ) ) {
     3936                                        echo '<li><span class="landexhub-consent-check-ok">&#10003;</span> ' . esc_html__( 'Necessary — it runs for every visitor, there is nothing to hold back', 'landexhub-consent' ) . '</li>';
     3937                                } elseif ( ! empty( $item['governed'] ) || $is_configured ) {
    39213938                                        echo '<li><span class="landexhub-consent-check-ok">&#10003;</span> ' . esc_html__( 'Consent governs it', 'landexhub-consent' ) . '</li>';
    39223939                                } else {
    … …  
    39823999                                }
    39834000
    3984                                 $this->render_scripts_help();
     4001                                $this->render_scripts_help( $this->rescan_url( self::PAGE_SERVICES, array( 'service' => $id ) ) );
    39854002                        },
    39864003                        'integrations'
    … …  
    40834100
    40844101        /**
     4102         * A service the catalog files as necessary (payments, spam protection): it runs for
     4103         * every visitor, so it is neither held back nor a problem.
     4104         *
     4105         * @param array $item Inventory item.
     4106         * @return bool
     4107         */
     4108        private function item_necessary( $item ) {
     4109                return 'necessary' === (string) $item['category'] && ! empty( $item['in_catalog'] );
     4110        }
     4111
     4112        /**
    40854113         * Status label of a service row.
    40864114         *
    … …  
    40924120                        return array( 'is-muted', __( 'Unassigned', 'landexhub-consent' ) );
    40934121                }
     4122                if ( $this->item_necessary( $item ) ) {
     4123                        return array( 'is-ok', __( 'Necessary', 'landexhub-consent' ) );
     4124                }
    40944125                if ( empty( $item['governed'] ) ) {
    40954126                        return array( 'is-warn', ! empty( $item['partial'] ) ? __( 'Partly governed', 'landexhub-consent' ) : __( 'Not governed yet', 'landexhub-consent' ) );
    … …  
    41104141                if ( ! empty( $item['configured'] ) ) {
    41114142                        echo '<span>' . esc_html__( 'Consent Mode v2 governs the consent.', 'landexhub-consent' ) . '</span>';
     4143                        return;
     4144                }
     4145                if ( $this->item_necessary( $item ) ) {
     4146                        echo '<span>' . esc_html__( 'Necessary — it runs for every visitor, there is nothing to hold back.', 'landexhub-consent' ) . '</span>';
    41124147                        return;
    41134148                }
  • landexhub-consent/trunk/includes/class-landexhub-consent-frontend.php

    r3758640 r3762168  
    3030                // Priority 5: optional GTM / gtag.js container right after the bootstrap.
    3131                add_action( 'wp_head', array( $this, 'print_google_tags' ), 5 );
     32                // The GTM <noscript> part goes immediately after the opening <body> tag, as Google asks.
     33                add_action( 'wp_body_open', array( $this, 'print_gtm_noscript' ), 0 );
    3234                // Priority 1: enqueue the core (UI, script activation, consent updates) early.
    3335                add_action( 'wp_enqueue_scripts', array( $this, 'enqueue' ), 1 );
    … …  
    157159        public static function exclude_handles( $handles ) {
    158160                $handles = is_array( $handles ) ? $handles : array();
    159                 foreach ( array( self::HANDLE, 'landexhub-consent-detect', 'landexhub-consent-gtag' ) as $handle ) {
     161                foreach ( array( self::HANDLE, 'landexhub-consent-detect' ) as $handle ) {
    160162                        if ( ! in_array( $handle, $handles, true ) ) {
    161163                                $handles[] = $handle;
    … …  
    469471                }
    470472
     473                // Google's snippets are printed as Google publishes them. The only addition is an id,
     474                // by which the site check tells the plugin's own tags from tags others add.
    471475                if ( '' !== $gtm ) {
    472476                        $js = "(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});"
    … …  
    474478                                . "j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);"
    475479                                . "})(window,document,'script','dataLayer','" . esc_js( $gtm ) . "');";
     480                        echo "<!-- Google Tag Manager -->\n";
    476481                        wp_print_inline_script_tag( $js, array( 'id' => 'landexhub-consent-gtm' ) );
     482                        echo "<!-- End Google Tag Manager -->\n";
    477483                }
    478484
    … …  
    485491                        }
    486492
    487                         wp_enqueue_script(
    488                                 'landexhub-consent-gtag',
    489                                 'https://www.googletagmanager.com/gtag/js?id=' . rawurlencode( $gtag ),
    490                                 array(),
    491                                 null, // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion -- Third-party script versioned by Google, not by this plugin; no version query string is added to its URL.
    492                                 false
    493                         );
     493                        // The async loader first, then the config, as in Google's snippet. Enqueueing would
     494                        // drop async: WordPress loads a script with an inline "after" part blocking.
    494495                        $js = 'window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}'
    495496                                . "gtag('js',new Date());gtag('config','" . esc_js( $gtag ) . "');";
    496                         wp_add_inline_script( 'landexhub-consent-gtag', $js );
    497                 }
     497                        echo "<!-- Google tag (gtag.js) -->\n";
     498                        wp_print_script_tag(
     499                                array(
     500                                        'async' => true,
     501                                        'src'   => 'https://www.googletagmanager.com/gtag/js?id=' . rawurlencode( $gtag ),
     502                                        'id'    => 'landexhub-consent-gtag-js',
     503                                )
     504                        );
     505                        wp_print_inline_script_tag( $js, array( 'id' => 'landexhub-consent-gtag-js-after' ) );
     506                }
     507        }
     508
     509        /**
     510         * The <noscript> part of Google's GTM snippet, immediately after the opening <body> tag
     511         * (themes call wp_body_open() there). Without JavaScript there is no consent bar and no
     512         * Consent Mode default, so the frame loads without a consent state, as in Google's own
     513         * installation.
     514         *
     515         * @return void
     516         */
     517        public function print_gtm_noscript() {
     518                $settings = LandexHub_Consent_Settings::get();
     519                $gtm      = (string) $settings['gtm_id'];
     520                if ( '' === $gtm ) {
     521                        return;
     522                }
     523                // The same condition as for the container in <head>: no frame without it.
     524                if ( $this->emits_consent_default() && '' === $this->bootstrap_js() ) {
     525                        return;
     526                }
     527                echo "<!-- Google Tag Manager (noscript) -->\n"
     528                        . '<noscript><iframe id="landexhub-consent-gtm-noscript" src="' . esc_url( 'https://www.googletagmanager.com/ns.html?id=' . rawurlencode( $gtm ) ) . '"'
     529                        . ' height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>' . "\n"
     530                        . "<!-- End Google Tag Manager (noscript) -->\n";
    498531        }
    499532
  • landexhub-consent/trunk/includes/class-landexhub-consent-google-check.php

    r3758640 r3762168  
    102102                // Remove all of our own tags so they do not look like a second snippet:
    103103                // landexhub-consent-gtm      inline GTM loader
    104                 // landexhub-consent-gtag-js  enqueued gtag.js (WordPress adds "-js" to the handle)
     104                // landexhub-consent-gtag-js  gtag.js loader (and -after, its config)
     105                // landexhub-consent-gtm-noscript  the GTM <noscript> frame
    105106                // Lazy-load plugins may rewrite src to data-src, so the id is the only reliable
    106107                // anchor.
    107108                $without_ours = preg_replace(
    108                         '/<script[^>]*\bid=["\']landexhub-consent-[^"\']*["\'][^>]*>[\s\S]*?<\/script>/i',
     109                        '/<(script|iframe)[^>]*\bid=["\']landexhub-consent-[^"\']*["\'][^>]*>[\s\S]*?<\/\1>/i',
    109110                        '',
    110111                        $html
  • landexhub-consent/trunk/includes/class-landexhub-consent-health.php

    r3758640 r3762168  
    151151                foreach ( isset( $scan['findings'] ) ? (array) $scan['findings'] : array() as $f ) {
    152152                        $name = '' !== (string) $f['vendor'] ? (string) $f['vendor'] : (string) $f['label'];
    153                         if ( empty( $f['google'] ) && empty( $f['gated'] ) ) {
     153                        if ( empty( $f['google'] ) && empty( $f['gated'] ) && empty( $f['necessary'] ) ) {
    154154                                $loose[] = $name;
    155155                        } elseif ( ! empty( $f['never_runs'] ) ) {
  • landexhub-consent/trunk/includes/class-landexhub-consent-inventory.php

    r3758640 r3762168  
    255255
    256256        /**
    257          * Match a stored service to a registry record via pattern substrings.
     257         * Match a stored service to a registry record via its name or pattern substrings.
    258258         *
    259259         * @param array $service  Stored service.
    … …  
    263263        private static function match_service( $service, $registry ) {
    264264                $patterns = isset( $service['patterns'] ) ? (array) $service['patterns'] : array();
     265
     266                // An entry saved from an inline snippet carries the service name instead of a host
     267                // (the snippet has none), so the catalog name and aliases count too. Otherwise the
     268                // entry would show up as a second service next to its catalog record.
     269                $name = strtolower( trim( isset( $service['name'] ) ? (string) $service['name'] : '' ) );
     270                if ( '' !== $name ) {
     271                        foreach ( $registry as $id => $record ) {
     272                                $names = array_merge(
     273                                        isset( $record['name'] ) ? array( (string) $record['name'] ) : array(),
     274                                        isset( $record['aliases'] ) ? (array) $record['aliases'] : array()
     275                                );
     276                                foreach ( $names as $candidate ) {
     277                                        if ( strtolower( trim( (string) $candidate ) ) === $name ) {
     278                                                return (string) $id;
     279                                        }
     280                                }
     281                        }
     282                }
     283
    265284                foreach ( $registry as $id => $record ) {
    266285                        $det  = isset( $record['detection'] ) ? (array) $record['detection'] : array();
  • landexhub-consent/trunk/includes/class-landexhub-consent-scan.php

    r3758640 r3762168  
    440440                $vendor = LandexHub_Consent_Vendors::lookup( $needle );
    441441                $google = (bool) ( $vendor && ! empty( $vendor['consentModeAware'] ) );
     442                // Payments, spam protection and the like: the catalog files them as necessary, they
     443                // run for every visitor and there is nothing to hold back.
     444                $necessary = ! $google && $vendor && 'necessary' === (string) $vendor['category'];
    442445
    443446                return array(
    … …  
    462465                        // Why marked occurrences are not gated (GATE_* codes).
    463466                        'problems'    => array(),
    464                         'reason'      => $google ? 'consent-mode' : '',
     467                        'reason'      => $google ? 'consent-mode' : ( $necessary ? 'necessary' : '' ),
    465468                        'evidence'    => '',
    466469                        'google'      => $google,
     470                        'necessary'   => $necessary,
    467471                );
    468472        }
  • landexhub-consent/trunk/landexhub-consent.php

    r3758640 r3762168  
    88 * Plugin Name:       LandexHub Consent – Cookie Banner, GDPR & Google Consent Mode v2
    99 * Description:       Cookie banner for GDPR with Google Consent Mode v2, script gating, site diagnostics and consent logging. No cloud service required.
    10  * Version:           0.9.2
     10 * Version:           0.9.3
    1111 * Requires at least: 6.3
    1212 * Requires PHP:      7.4
    … …  
    2121defined( 'ABSPATH' ) || exit;
    2222
    23 define( 'LANDEXHUB_CONSENT_VERSION', '0.9.2' );
     23define( 'LANDEXHUB_CONSENT_VERSION', '0.9.3' );
    2424define( 'LANDEXHUB_CONSENT_PLUGIN_FILE', __FILE__ );
    2525define( 'LANDEXHUB_CONSENT_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
  • landexhub-consent/trunk/languages/landexhub-consent-cs_CZ.po

    r3758640 r3762168  
    937937msgstr "Nezbytné — popis"
    938938
     939msgid "Necessary — it runs for every visitor, there is nothing to hold back"
     940msgstr "Nezbytné — běží pro každého návštěvníka, není co zadržovat"
     941
     942msgid "Necessary — it runs for every visitor, there is nothing to hold back."
     943msgstr "Nezbytné — běží pro každého návštěvníka, není co zadržovat."
     944
    939945msgid "Necessary — name"
    940946msgstr "Nezbytné — název"
    … …  
    11971203msgid "Rounding of the bar and the settings window, in pixels."
    11981204msgstr "Zaoblení lišty a okna s nastavením, v pixelech."
     1205
     1206msgid "runs for every visitor, there is nothing to hold back"
     1207msgstr "běží pro každého návštěvníka, není co zadržovat"
    11991208
    12001209msgid "Save"
  • landexhub-consent/trunk/languages/landexhub-consent-de_DE.po

    r3758640 r3762168  
    929929msgstr "Notwendig — Beschreibung"
    930930
     931msgid "Necessary — it runs for every visitor, there is nothing to hold back"
     932msgstr "Notwendig – läuft für alle Besucher, es gibt nichts zurückzuhalten"
     933
     934msgid "Necessary — it runs for every visitor, there is nothing to hold back."
     935msgstr "Notwendig – läuft für alle Besucher, es gibt nichts zurückzuhalten."
     936
    931937msgid "Necessary — name"
    932938msgstr "Notwendig — Name"
    … …  
    11891195msgid "Rounding of the bar and the settings window, in pixels."
    11901196msgstr "Rundung der Leiste und des Einstellungsfensters, in Pixeln."
     1197
     1198msgid "runs for every visitor, there is nothing to hold back"
     1199msgstr "läuft für alle Besucher, es gibt nichts zurückzuhalten"
    11911200
    11921201msgid "Save"
  • landexhub-consent/trunk/languages/landexhub-consent-pl_PL.po

    r3758640 r3762168  
    937937msgstr "Niezbędne — opis"
    938938
     939msgid "Necessary — it runs for every visitor, there is nothing to hold back"
     940msgstr "Niezbędne — działa dla każdego odwiedzającego, nie ma czego wstrzymywać"
     941
     942msgid "Necessary — it runs for every visitor, there is nothing to hold back."
     943msgstr "Niezbędne — działa dla każdego odwiedzającego, nie ma czego wstrzymywać."
     944
    939945msgid "Necessary — name"
    940946msgstr "Niezbędne — nazwa"
    … …  
    11971203msgid "Rounding of the bar and the settings window, in pixels."
    11981204msgstr "Zaokrąglenie paska i okna ustawień, w pikselach."
     1205
     1206msgid "runs for every visitor, there is nothing to hold back"
     1207msgstr "działa dla każdego odwiedzającego, nie ma czego wstrzymywać"
    11991208
    12001209msgid "Save"
  • landexhub-consent/trunk/languages/landexhub-consent-sk_SK.po

    r3758640 r3762168  
    937937msgstr "Nevyhnutné — popis"
    938938
     939msgid "Necessary — it runs for every visitor, there is nothing to hold back"
     940msgstr "Nevyhnutné — beží pre každého návštevníka, nie je čo zadržiavať"
     941
     942msgid "Necessary — it runs for every visitor, there is nothing to hold back."
     943msgstr "Nevyhnutné — beží pre každého návštevníka, nie je čo zadržiavať."
     944
    939945msgid "Necessary — name"
    940946msgstr "Nevyhnutné — názov"
    … …  
    11971203msgid "Rounding of the bar and the settings window, in pixels."
    11981204msgstr "Zaoblenie lišty a okna s nastavením, v pixeloch."
     1205
     1206msgid "runs for every visitor, there is nothing to hold back"
     1207msgstr "beží pre každého návštevníka, nie je čo zadržiavať"
    11991208
    12001209msgid "Save"
  • landexhub-consent/trunk/languages/landexhub-consent.pot

    r3758640 r3762168  
    1313
    1414#. translators: accessible suffix telling screen readers the link opens a new tab.
    15 #: includes/class-landexhub-consent-admin.php:783 includes/class-landexhub-consent-admin.php:3790
     15#: includes/class-landexhub-consent-admin.php:783 includes/class-landexhub-consent-admin.php:3803
    1616msgid "(opens in a new tab)"
    1717msgstr ""
    1818
    1919#. translators: %d: number of services.
    20 #: includes/class-landexhub-consent-admin.php:3853
     20#: includes/class-landexhub-consent-admin.php:3866
    2121msgid "%d all good"
    2222msgstr ""
    2323
    2424#. translators: %d: number of checks.
    25 #: includes/class-landexhub-consent-admin.php:4265
     25#: includes/class-landexhub-consent-admin.php:4300
    2626msgid "%d check is not verified yet."
    2727msgid_plural "%d checks are not verified yet."
    … …  
    3737
    3838#. translators: %d: number of issues.
    39 #: includes/class-landexhub-consent-admin.php:4259
     39#: includes/class-landexhub-consent-admin.php:4294
    4040msgid "%d issue requires attention"
    4141msgid_plural "%d issues require attention"
    … …  
    5858
    5959#. translators: %d: number of services.
    60 #: includes/class-landexhub-consent-admin.php:3857
     60#: includes/class-landexhub-consent-admin.php:3870
    6161msgid "%d needs attention"
    6262msgstr ""
    … …  
    7373
    7474#. translators: %d: number of services.
    75 #: includes/class-landexhub-consent-admin.php:3850
     75#: includes/class-landexhub-consent-admin.php:3863
    7676msgid "%d services found"
    7777msgstr ""
    … …  
    9292
    9393#. translators: %d: number of sources.
    94 #: includes/class-landexhub-consent-admin.php:3861
     94#: includes/class-landexhub-consent-admin.php:3874
    9595msgid "%d unassigned"
    9696msgstr ""
    … …  
    104104
    105105#. translators: %s: plugin name.
    106 #: includes/class-landexhub-consent-admin.php:2717
     106#: includes/class-landexhub-consent-admin.php:2723
    107107msgid "%s — it inserts its own Google tags and LandexHub Consent does not block them"
    108108msgstr ""
    109109
    110110#. translators: %s: comma-separated list of Google tag IDs.
    111 #: includes/class-landexhub-consent-admin.php:2725
     111#: includes/class-landexhub-consent-admin.php:2731
    112112msgid "%s — loaded by your theme or another plugin, not by LandexHub Consent"
    113113msgstr ""
    … …  
    119119
    120120#. translators: %s: plugin name.
    121 #: includes/class-landexhub-consent-admin.php:2648
     121#: includes/class-landexhub-consent-admin.php:2654
    122122msgid "%s allows measurement before the visitor decides."
    123123msgstr ""
    … …  
    129129
    130130#. translators: %s: plugin name.
    131 #: includes/class-landexhub-consent-admin.php:2675
     131#: includes/class-landexhub-consent-admin.php:2681
    132132msgid "%s sends its own Consent Mode default."
    133133msgstr ""
    … …  
    166166msgstr ""
    167167
    168 #: includes/class-landexhub-consent-admin.php:2986
     168#: includes/class-landexhub-consent-admin.php:2994
    169169msgid "A plugin that gets the decision this way keeps running its own tags — do not block its scripts by hand as well."
    170170msgstr ""
    … …  
    174174msgstr ""
    175175
    176 #: includes/class-landexhub-consent-admin.php:3575
     176#: includes/class-landexhub-consent-admin.php:3587
    177177msgid "a script a plugin enqueues"
    178178msgstr ""
    179179
    180 #: includes/class-landexhub-consent-admin.php:3574
     180#: includes/class-landexhub-consent-admin.php:3586
    181181msgid "a script hardcoded in the template"
    182182msgstr ""
    183183
    184 #: includes/class-landexhub-consent-admin.php:2561
     184#: includes/class-landexhub-consent-admin.php:2564
    185185msgid "a script in the template"
    186186msgstr ""
    187187
    188 #: includes/class-landexhub-consent-admin.php:3576
     188#: includes/class-landexhub-consent-admin.php:3588
    189189msgid "a script written straight into the page"
    190190msgstr ""
    … …  
    198198msgstr ""
    199199
    200 #: includes/class-landexhub-consent-admin.php:2565
     200#: includes/class-landexhub-consent-admin.php:2568
    201201msgid "a tracking pixel"
    202202msgstr ""
    … …  
    218218msgstr ""
    219219
    220 #: includes/class-landexhub-consent-admin.php:2331 includes/class-landexhub-consent-admin.php:3948 includes/class-landexhub-consent-admin.php:4020
     220#: includes/class-landexhub-consent-admin.php:2331 includes/class-landexhub-consent-admin.php:3965 includes/class-landexhub-consent-admin.php:4037
    221221msgid "Actions"
    222222msgstr ""
    … …  
    227227msgstr ""
    228228
    229 #: includes/class-landexhub-consent-admin.php:3770 includes/class-landexhub-consent-admin.php:4173
     229#: includes/class-landexhub-consent-admin.php:3783 includes/class-landexhub-consent-admin.php:4208
    230230msgid "Add measurement"
    231231msgstr ""
    232232
    233 #: includes/class-landexhub-consent-admin.php:4220
     233#: includes/class-landexhub-consent-admin.php:4255
    234234msgid "Add measurement (GTM / gtag)"
    235235msgstr ""
    236236
    237 #: includes/class-landexhub-consent-admin.php:4201
     237#: includes/class-landexhub-consent-admin.php:4236
    238238msgid "Add to the site"
    239239msgstr ""
    240240
    241 #: includes/class-landexhub-consent-admin.php:3629
     241#: includes/class-landexhub-consent-admin.php:3642
    242242msgid "Added by a plugin or the theme?"
    243243msgstr ""
    … …  
    247247msgstr ""
    248248
    249 #: includes/class-landexhub-consent-admin.php:4148
     249#: includes/class-landexhub-consent-admin.php:4183
    250250msgid "Added by you"
    251251msgstr ""
    252252
    253 #: includes/class-landexhub-consent-admin.php:3514 includes/class-landexhub-consent-admin.php:3917
     253#: includes/class-landexhub-consent-admin.php:3522 includes/class-landexhub-consent-admin.php:3932
    254254msgid "Added by you, not found on the front page"
    255255msgstr ""
    256256
    257257#. translators: %s: who inserts the service.
    258 #: includes/class-landexhub-consent-admin.php:4032 includes/class-landexhub-consent-admin.php:4055
     258#: includes/class-landexhub-consent-admin.php:4049 includes/class-landexhub-consent-admin.php:4072
    259259msgid "Adds it: %s"
    260260msgstr ""
    261261
    262 #: includes/class-landexhub-consent-admin.php:130 includes/class-landexhub-consent-admin.php:145 includes/class-landexhub-consent-admin.php:4305
     262#: includes/class-landexhub-consent-admin.php:130 includes/class-landexhub-consent-admin.php:145 includes/class-landexhub-consent-admin.php:4340
    263263msgid "Advanced"
    264264msgstr ""
    … …  
    302302msgstr ""
    303303
    304 #: includes/class-landexhub-consent-admin.php:2610
     304#: includes/class-landexhub-consent-admin.php:2615
    305305msgid "Always loads"
    306306msgstr ""
    … …  
    318318msgstr ""
    319319
    320 #: includes/class-landexhub-consent-admin.php:2553
     320#: includes/class-landexhub-consent-admin.php:2556
    321321msgid "an embedded frame"
    322322msgstr ""
    … …  
    326326msgstr ""
    327327
    328 #: includes/class-landexhub-consent-admin.php:3577
     328#: includes/class-landexhub-consent-admin.php:3589
    329329msgid "an embedded video · iframe"
    330330msgstr ""
    331331
    332 #: includes/class-landexhub-consent-admin.php:2559
     332#: includes/class-landexhub-consent-admin.php:2562
    333333msgid "an enqueued script"
    334334msgstr ""
    335335
    336 #: includes/class-landexhub-consent-admin.php:3606 includes/class-landexhub-consent-admin.php:3699 includes/class-landexhub-consent-services.php:52
     336#: includes/class-landexhub-consent-admin.php:3619 includes/class-landexhub-consent-admin.php:3712 includes/class-landexhub-consent-services.php:52
    337337msgid "Analytics"
    338338msgstr ""
    … …  
    354354msgstr ""
    355355
    356 #: includes/class-landexhub-consent-admin.php:3041
     356#: includes/class-landexhub-consent-admin.php:3049
    357357msgid "Ask all visitors for consent again?"
    358358msgstr ""
    359359
    360 #: includes/class-landexhub-consent-admin.php:3040
     360#: includes/class-landexhub-consent-admin.php:3048
    361361msgid "Ask every visitor again (current choices stop being used)."
    362362msgstr ""
    363363
    364 #: includes/class-landexhub-consent-admin.php:4063
     364#: includes/class-landexhub-consent-admin.php:4080
    365365msgid "Assign"
    366366msgstr ""
    … …  
    374374msgstr ""
    375375
    376 #: includes/class-landexhub-consent-admin.php:3891 includes/class-landexhub-consent-admin.php:3903
     376#: includes/class-landexhub-consent-admin.php:3907 includes/class-landexhub-consent-admin.php:3918
    377377msgid "Back to Services"
    378378msgstr ""
    … …  
    402402msgstr ""
    403403
    404 #: includes/class-landexhub-consent-admin.php:2736
     404#: includes/class-landexhub-consent-admin.php:2742
    405405msgid "Basic mode does not cover everything on this site."
    406406msgstr ""
    … …  
    414414msgstr ""
    415415
    416 #: includes/class-landexhub-consent-admin.php:3626
     416#: includes/class-landexhub-consent-admin.php:3639
    417417msgid "Both parts are required: without type=\"text/plain\" the browser runs the script anyway, and an external script must have src renamed to data-src, or the file is downloaded right away."
    418418msgstr ""
    … …  
    426426msgstr ""
    427427
    428 #: includes/class-landexhub-consent-admin.php:3614 includes/class-landexhub-consent-admin.php:3656
     428#: includes/class-landexhub-consent-admin.php:3627 includes/class-landexhub-consent-admin.php:3669
    429429msgid "By hand in the template"
    430430msgstr ""
    431431
    432432#. translators: %s: registry schema version.
    433 #: includes/class-landexhub-consent-admin.php:3546 includes/class-landexhub-consent-admin.php:3980
     433#: includes/class-landexhub-consent-admin.php:3556 includes/class-landexhub-consent-admin.php:3997
    434434msgid "Catalog data: LandexHub Consent Service Registry %s."
    435435msgstr ""
    … …  
    455455msgstr ""
    456456
    457 #: includes/class-landexhub-consent-admin.php:2042 includes/class-landexhub-consent-admin.php:2329 includes/class-landexhub-consent-admin.php:3476 includes/class-landexhub-consent-admin.php:4017
     457#: includes/class-landexhub-consent-admin.php:2042 includes/class-landexhub-consent-admin.php:2329 includes/class-landexhub-consent-admin.php:3484 includes/class-landexhub-consent-admin.php:4034
    458458msgid "Category"
    459459msgstr ""
    … …  
    468468msgstr ""
    469469
    470 #: includes/class-landexhub-consent-admin.php:4098
     470#: includes/class-landexhub-consent-admin.php:4129
    471471msgid "Category turned off"
    472472msgstr ""
    … …  
    476476msgstr ""
    477477
    478 #: includes/class-landexhub-consent-admin.php:2903
     478#: includes/class-landexhub-consent-admin.php:2911
    479479msgid "Channel"
    480480msgstr ""
    481481
    482 #: includes/class-landexhub-consent-admin.php:4254
     482#: includes/class-landexhub-consent-admin.php:4289
    483483msgid "Check again"
    484484msgstr ""
    485485
    486 #: includes/class-landexhub-consent-admin.php:3667
     486#: includes/class-landexhub-consent-admin.php:3680
    487487msgid "Check that it follows consent, not just the click."
    488488msgstr ""
    … …  
    492492msgstr ""
    493493
    494 #: includes/class-landexhub-consent-admin.php:3056
     494#: includes/class-landexhub-consent-admin.php:3064
    495495msgid "Choose a JSON file created by Export settings. Nothing is changed unless the whole file is valid."
    496496msgstr ""
    497497
    498 #: includes/class-landexhub-consent-admin.php:1722 includes/class-landexhub-consent-admin.php:2133 includes/class-landexhub-consent-admin.php:3565 includes/class-landexhub-consent-admin.php:3715 includes/class-landexhub-consent-admin.php:4174 includes/class-landexhub-consent-admin.php:4200
     498#: includes/class-landexhub-consent-admin.php:1722 includes/class-landexhub-consent-admin.php:2133 includes/class-landexhub-consent-admin.php:3577 includes/class-landexhub-consent-admin.php:3728 includes/class-landexhub-consent-admin.php:4209 includes/class-landexhub-consent-admin.php:4235
    499499msgid "Close"
    500500msgstr ""
    … …  
    512512msgstr ""
    513513
    514 #: includes/class-landexhub-consent-admin.php:3604 includes/class-landexhub-consent-admin.php:3697 includes/class-landexhub-consent-frontend.php:303
     514#: includes/class-landexhub-consent-admin.php:3617 includes/class-landexhub-consent-admin.php:3710 includes/class-landexhub-consent-frontend.php:303
    515515msgid "Consent category"
    516516msgstr ""
    … …  
    520520msgstr ""
    521521
    522 #: includes/class-landexhub-consent-admin.php:2610 includes/class-landexhub-consent-admin.php:3521 includes/class-landexhub-consent-admin.php:3921 includes/class-landexhub-consent-admin.php:4100
     522#: includes/class-landexhub-consent-admin.php:2615 includes/class-landexhub-consent-admin.php:3531 includes/class-landexhub-consent-admin.php:3938 includes/class-landexhub-consent-admin.php:4131
    523523msgid "Consent governs it"
    524524msgstr ""
    525525
    526 #: includes/class-landexhub-consent-admin.php:4060
     526#: includes/class-landexhub-consent-admin.php:4077
    527527msgid "Consent governs it — the service is not in the catalog or in your services list."
    528528msgstr ""
    … …  
    537537msgstr ""
    538538
    539 #: includes/class-landexhub-consent-admin.php:141 includes/class-landexhub-consent-admin.php:2787
     539#: includes/class-landexhub-consent-admin.php:141 includes/class-landexhub-consent-admin.php:2793
    540540msgid "Consent integrations"
    541541msgstr ""
    542542
    543 #: includes/class-landexhub-consent-admin.php:142 includes/class-landexhub-consent-admin.php:549 includes/class-landexhub-consent-admin.php:3010 includes/class-landexhub-consent-privacy.php:85
     543#: includes/class-landexhub-consent-admin.php:142 includes/class-landexhub-consent-admin.php:549 includes/class-landexhub-consent-admin.php:3018 includes/class-landexhub-consent-privacy.php:85
    544544msgid "Consent log"
    545545msgstr ""
    546546
    547 #: includes/class-landexhub-consent-admin.php:4273
     547#: includes/class-landexhub-consent-admin.php:4308
    548548msgid "Consent Mode"
    549549msgstr ""
    … …  
    569569msgstr ""
    570570
    571 #: includes/class-landexhub-consent-admin.php:4111 includes/class-landexhub-consent-admin.php:4128
     571#: includes/class-landexhub-consent-admin.php:4142 includes/class-landexhub-consent-admin.php:4163
    572572msgid "Consent Mode v2 governs the consent."
    573573msgstr ""
    574574
    575 #: includes/class-landexhub-consent-admin.php:4279
     575#: includes/class-landexhub-consent-admin.php:4314
    576576msgid "Consent setup"
    577577msgstr ""
    … …  
    581581msgstr ""
    582582
    583 #: includes/class-landexhub-consent-admin.php:3034
     583#: includes/class-landexhub-consent-admin.php:3042
    584584msgid "Consents & settings"
    585585msgstr ""
    586586
    587 #: includes/class-landexhub-consent-admin.php:4288
     587#: includes/class-landexhub-consent-admin.php:4323
    588588msgid "Consents in the last 30 days"
    589589msgstr ""
    … …  
    605605msgstr ""
    606606
    607 #: includes/class-landexhub-consent-admin.php:3620
     607#: includes/class-landexhub-consent-admin.php:3633
    608608msgid "Copy"
    609609msgstr ""
    610610
    611 #: includes/class-landexhub-consent-admin.php:3065
     611#: includes/class-landexhub-consent-admin.php:3073
    612612msgid "Copy this when contacting support."
    613613msgstr ""
    … …  
    665665msgstr ""
    666666
    667 #: includes/class-landexhub-consent-admin.php:3610
     667#: includes/class-landexhub-consent-admin.php:3623
    668668msgid "Decides when the source may run. The snippet below follows it."
    669669msgstr ""
    … …  
    702702msgstr ""
    703703
    704 #: includes/class-landexhub-consent-admin.php:4046
     704#: includes/class-landexhub-consent-admin.php:4063
    705705msgid "Detail"
    706706msgstr ""
    … …  
    710710msgstr ""
    711711
    712 #: includes/class-landexhub-consent-admin.php:3064
     712#: includes/class-landexhub-consent-admin.php:3072
    713713msgid "Diagnostic report"
    714714msgstr ""
    715715
    716 #: includes/class-landexhub-consent-admin.php:129 includes/class-landexhub-consent-admin.php:4236
     716#: includes/class-landexhub-consent-admin.php:129 includes/class-landexhub-consent-admin.php:4271
    717717msgid "Diagnostics"
    718718msgstr ""
    … …  
    722722msgstr ""
    723723
    724 #: includes/class-landexhub-consent-admin.php:4189
     724#: includes/class-landexhub-consent-admin.php:4224
    725725msgid "Direct measurement ID (gtag.js)"
    726726msgstr ""
    … …  
    738738msgstr ""
    739739
    740 #: includes/class-landexhub-consent-admin.php:3049
     740#: includes/class-landexhub-consent-admin.php:3057
    741741msgid "Download the configuration as JSON."
    742742msgstr ""
    … …  
    754754msgstr ""
    755755
    756 #: includes/class-landexhub-consent-admin.php:2587
     756#: includes/class-landexhub-consent-admin.php:2590
    757757msgid "embedded frames cannot be held back by the consent bar"
    758758msgstr ""
    759759
    760 #: includes/class-landexhub-consent-admin.php:4269
     760#: includes/class-landexhub-consent-admin.php:4304
    761761msgid "every check below was actually performed; hover a row for its evidence."
    762762msgstr ""
    … …  
    778778msgstr ""
    779779
    780 #: includes/class-landexhub-consent-admin.php:3471
     780#: includes/class-landexhub-consent-admin.php:3479
    781781msgid "Everything LandexHub Consent knows about the services this site uses — catalog knowledge, what the check found here, and your own services list. Catalog updates never overwrite your list."
    782782msgstr ""
    783783
    784 #: includes/class-landexhub-consent-admin.php:4268
     784#: includes/class-landexhub-consent-admin.php:4303
    785785msgid "Everything looks good"
    786786msgstr ""
    787787
    788 #: includes/class-landexhub-consent-admin.php:3947
     788#: includes/class-landexhub-consent-admin.php:3964
    789789msgid "Evidence"
    790790msgstr ""
    … …  
    802802msgstr ""
    803803
    804 #: includes/class-landexhub-consent-admin.php:3048 includes/class-landexhub-consent-admin.php:3050
     804#: includes/class-landexhub-consent-admin.php:3056 includes/class-landexhub-consent-admin.php:3058
    805805msgid "Export settings"
    806806msgstr ""
    … …  
    826826msgstr ""
    827827
    828 #: includes/class-landexhub-consent-admin.php:3615
     828#: includes/class-landexhub-consent-admin.php:3628
    829829msgid "Find the tag in the template and rewrite it like this. LandexHub Consent runs it once the visitor consents to the category."
    830830msgstr ""
    … …  
    863863msgstr ""
    864864
    865 #: includes/class-landexhub-consent-admin.php:3477
     865#: includes/class-landexhub-consent-admin.php:3485
    866866msgid "Found here"
    867867msgstr ""
    … …  
    879879msgstr ""
    880880
    881 #: includes/class-landexhub-consent-admin.php:3912
     881#: includes/class-landexhub-consent-admin.php:3927
    882882msgid "Found on this site"
    883883msgstr ""
    884884
    885 #: includes/class-landexhub-consent-admin.php:4190
     885#: includes/class-landexhub-consent-admin.php:4225
    886886msgid "GA4 or Google Ads without a container (G-XXXX / AW-XXXX). The Basic/Advanced switch applies to it."
    887887msgstr ""
    … …  
    891891msgstr ""
    892892
    893 #: includes/class-landexhub-consent-admin.php:4061
     893#: includes/class-landexhub-consent-admin.php:4078
    894894msgid "Gate it by hand and save it to your services list with a category."
    895895msgstr ""
    896896
    897 #: includes/class-landexhub-consent-admin.php:3568
     897#: includes/class-landexhub-consent-admin.php:3580
    898898msgid "Gate source"
    899899msgstr ""
    900900
    901 #: includes/class-landexhub-consent-admin.php:2533
     901#: includes/class-landexhub-consent-admin.php:2536
    902902msgid "gated by hand"
    903903msgstr ""
    … …  
    920920msgstr ""
    921921
    922 #: includes/class-landexhub-consent-admin.php:4182
     922#: includes/class-landexhub-consent-admin.php:4217
    923923msgid "Google Tag Manager"
    924924msgstr ""
    925925
    926 #: includes/class-landexhub-consent-admin.php:3478
     926#: includes/class-landexhub-consent-admin.php:3486
    927927msgid "Governance"
    928928msgstr ""
    … …  
    940940msgstr ""
    941941
    942 #: includes/class-landexhub-consent-admin.php:4131
     942#: includes/class-landexhub-consent-admin.php:4166
    943943msgid "Held back until the visitor consents."
    944944msgstr ""
    945945
    946 #: includes/class-landexhub-consent-admin.php:4123
     946#: includes/class-landexhub-consent-admin.php:4158
    947947msgid "Held back, but it waits for a category the consent bar does not offer, so it never runs. Turn the category on or remove the source."
    948948msgstr ""
    949949
    950 #: includes/class-landexhub-consent-admin.php:2588
     950#: includes/class-landexhub-consent-admin.php:2591
    951951msgid "held back, but its category is turned off, so it never runs"
    952952msgstr ""
    … …  
    960960msgstr ""
    961961
    962 #: includes/class-landexhub-consent-admin.php:2939
     962#: includes/class-landexhub-consent-admin.php:2947
    963963msgid "How"
    964964msgstr ""
    … …  
    976976msgstr ""
    977977
    978 #: includes/class-landexhub-consent-admin.php:3630
     978#: includes/class-landexhub-consent-admin.php:3643
    979979msgid "If it comes through enqueue, leave the tag alone — add this to functions.php."
    980980msgstr ""
    981981
    982 #: includes/class-landexhub-consent-admin.php:4217
     982#: includes/class-landexhub-consent-admin.php:4252
    983983msgid "If you want measurement, add it through LandexHub Consent — consent is handled from the first moment."
    984984msgstr ""
    … …  
    988988msgstr ""
    989989
    990 #: includes/class-landexhub-consent-admin.php:3055 includes/class-landexhub-consent-admin.php:3058
     990#: includes/class-landexhub-consent-admin.php:3063 includes/class-landexhub-consent-admin.php:3066
    991991msgid "Import settings"
    992992msgstr ""
    … …  
    10001000msgstr ""
    10011001
    1002 #: includes/class-landexhub-consent-admin.php:3500 includes/class-landexhub-consent-admin.php:4037
     1002#: includes/class-landexhub-consent-admin.php:3508 includes/class-landexhub-consent-admin.php:4054
    10031003msgid "In your list"
    10041004msgstr ""
    … …  
    10121012msgstr ""
    10131013
    1014 #: includes/class-landexhub-consent-admin.php:2933
     1014#: includes/class-landexhub-consent-admin.php:2941
    10151015msgid "Install it"
    10161016msgstr ""
    10171017
    1018 #: includes/class-landexhub-consent-admin.php:2686
     1018#: includes/class-landexhub-consent-admin.php:2692
    10191019msgid "Install WP Consent API"
    10201020msgstr ""
    10211021
    1022 #: includes/class-landexhub-consent-admin.php:1595 includes/class-landexhub-consent-admin.php:3123 includes/class-landexhub-consent-admin.php:3278 includes/class-landexhub-consent-admin.php:4328 includes/class-landexhub-consent-integrations.php:478 includes/class-landexhub-consent-log-admin.php:219 includes/class-landexhub-consent-log-admin.php:416 includes/class-landexhub-consent-log-admin.php:441 includes/class-landexhub-consent-services.php:531 includes/class-landexhub-consent-services.php:582 includes/class-landexhub-consent-texts.php:213
     1022#: includes/class-landexhub-consent-admin.php:1595 includes/class-landexhub-consent-admin.php:3131 includes/class-landexhub-consent-admin.php:3286 includes/class-landexhub-consent-admin.php:4363 includes/class-landexhub-consent-integrations.php:478 includes/class-landexhub-consent-log-admin.php:219 includes/class-landexhub-consent-log-admin.php:416 includes/class-landexhub-consent-log-admin.php:441 includes/class-landexhub-consent-services.php:531 includes/class-landexhub-consent-services.php:582 includes/class-landexhub-consent-texts.php:213
    10231023msgid "Insufficient permissions."
    10241024msgstr ""
    … …  
    10281028msgstr ""
    10291029
    1030 #: includes/class-landexhub-consent-admin.php:4237
     1030#: includes/class-landexhub-consent-admin.php:4272
    10311031msgid "Is LandexHub Consent and the measurement on this site set up correctly?"
    10321032msgstr ""
    10331033
    1034 #: includes/class-landexhub-consent-admin.php:2680
     1034#: includes/class-landexhub-consent-admin.php:2686
    10351035msgid "It grants nothing before consent, so it agrees with the LandexHub Consent default and nothing needs to change."
    10361036msgstr ""
    10371037
    1038 #: includes/class-landexhub-consent-admin.php:2922
     1038#: includes/class-landexhub-consent-admin.php:2930
    10391039msgid "It is part of LandexHub Consent itself."
    10401040msgstr ""
    10411041
    1042 #: includes/class-landexhub-consent-admin.php:2653
     1042#: includes/class-landexhub-consent-admin.php:2659
    10431043msgid "It sends its own Consent Mode default after ours and sets these signals to granted:"
    10441044msgstr ""
    … …  
    10561056msgstr ""
    10571057
    1058 #: includes/class-landexhub-consent-admin.php:2684
     1058#: includes/class-landexhub-consent-admin.php:2690
    10591059msgid "Its own Consent Mode reads the visitor's decision from the WP Consent API, which is not installed. Its Google tag still follows the Consent Mode signals LandexHub Consent sends."
    10601060msgstr ""
    … …  
    10681068msgstr ""
    10691069
    1070 #: includes/class-landexhub-consent-admin.php:3479 includes/class-landexhub-consent-admin.php:3964
     1070#: includes/class-landexhub-consent-admin.php:3487 includes/class-landexhub-consent-admin.php:3981
    10711071msgid "Known data"
    10721072msgstr ""
    10731073
    1074 #: includes/class-landexhub-consent-admin.php:3788
     1074#: includes/class-landexhub-consent-admin.php:3801
    10751075msgid "LandexHub also makes a separate, optional add-on for this plugin. Everything on these screens works without it."
    10761076msgstr ""
    … …  
    10801080msgstr ""
    10811081
    1082 #: includes/class-landexhub-consent-admin.php:3914 includes/class-landexhub-consent-admin.php:4145
     1082#: includes/class-landexhub-consent-admin.php:3929 includes/class-landexhub-consent-admin.php:4180
    10831083msgid "LandexHub Consent (your measurement ID)"
    10841084msgstr ""
    … …  
    10881088msgstr ""
    10891089
    1090 #: includes/class-landexhub-consent-admin.php:2744
     1090#: includes/class-landexhub-consent-admin.php:2750
    10911091msgid "LandexHub Consent does not block tags that other plugins add. To hold them back, gate them by hand or turn off their own Google tags."
    10921092msgstr ""
    10931093
    1094 #: includes/class-landexhub-consent-admin.php:2665
     1094#: includes/class-landexhub-consent-admin.php:2671
    10951095msgid "LandexHub Consent does not overwrite it — set that default to denied in the plugin, or turn its Consent Mode off."
    10961096msgstr ""
    … …  
    11011101msgstr ""
    11021102
    1103 #: includes/class-landexhub-consent-admin.php:2937
     1103#: includes/class-landexhub-consent-admin.php:2945
    11041104msgid "LandexHub Consent has no way to pass consent to this plugin, so it leaves it alone. Gate its scripts by hand instead."
    11051105msgstr ""
    … …  
    11091109msgstr ""
    11101110
    1111 #: includes/class-landexhub-consent-admin.php:4175
     1111#: includes/class-landexhub-consent-admin.php:4210
    11121112msgid "LandexHub Consent inserts the tag itself, right after its own Consent Mode default."
    11131113msgstr ""
    … …  
    11171117msgstr ""
    11181118
    1119 #: includes/class-landexhub-consent-admin.php:4277
     1119#: includes/class-landexhub-consent-admin.php:4312
    11201120msgid "LandexHub Consent provides the technical layer — legal responsibility for compliance stays with the site owner."
    11211121msgstr ""
    … …  
    11471147
    11481148#. translators: %s: human-readable time difference, e.g. "4 mins".
    1149 #: includes/class-landexhub-consent-admin.php:4072
     1149#: includes/class-landexhub-consent-admin.php:4089
    11501150msgid "Last site check: %s ago."
    11511151msgstr ""
    11521152
    1153 #: includes/class-landexhub-consent-admin.php:3789
     1153#: includes/class-landexhub-consent-admin.php:3802
    11541154msgid "Learn more"
    11551155msgstr ""
    … …  
    11721172msgstr ""
    11731173
    1174 #: includes/class-landexhub-consent-admin.php:3665
     1174#: includes/class-landexhub-consent-admin.php:3678
    11751175msgid "Looks almost the same. Needed for every video separately."
    11761176msgstr ""
    … …  
    11811181msgstr ""
    11821182
     1183#: includes/class-landexhub-consent-admin.php:2589
     1184msgid "marked, but a pixel needs data-cnsx-pixel, data-consent-category and its address in data-src"
     1185msgstr ""
     1186
    11831187#: includes/class-landexhub-consent-admin.php:2586
    1184 msgid "marked, but a pixel needs data-cnsx-pixel, data-consent-category and its address in data-src"
    1185 msgstr ""
    1186 
    1187 #: includes/class-landexhub-consent-admin.php:2583
    11881188msgid "marked, but the address is still in src (move it to data-src)"
    11891189msgstr ""
    11901190
    1191 #: includes/class-landexhub-consent-admin.php:2584
     1191#: includes/class-landexhub-consent-admin.php:2587
    11921192msgid "marked, but type=\"text/plain\" is missing"
    11931193msgstr ""
    11941194
    1195 #: includes/class-landexhub-consent-admin.php:2585
     1195#: includes/class-landexhub-consent-admin.php:2588
    11961196msgid "marked, but without a valid category (analytics, marketing or preferences)"
    11971197msgstr ""
    11981198
    1199 #: includes/class-landexhub-consent-admin.php:3607 includes/class-landexhub-consent-admin.php:3700 includes/class-landexhub-consent-services.php:53
     1199#: includes/class-landexhub-consent-admin.php:3620 includes/class-landexhub-consent-admin.php:3713 includes/class-landexhub-consent-services.php:53
    12001200msgid "Marketing"
    12011201msgstr ""
    … …  
    12091209msgstr ""
    12101210
    1211 #: includes/class-landexhub-consent-admin.php:3658
     1211#: includes/class-landexhub-consent-admin.php:3671
    12121212msgid "Marking the tag does not hold back an <iframe>. With its address left in src it loads before consent; with the address moved to data-src it does not load, but LandexHub Consent revives only <script> and cannot start it after consent either."
    12131213msgstr ""
    … …  
    12301230msgstr ""
    12311231
    1232 #: includes/class-landexhub-consent-admin.php:4309
     1232#: includes/class-landexhub-consent-admin.php:4344
    12331233msgid "Measurement IDs (GTM / gtag) live on the Services page — that is where measurement is added and changed."
    12341234msgstr ""
    … …  
    12581258msgstr ""
    12591259
    1260 #: includes/class-landexhub-consent-services.php:51
     1260#: includes/class-landexhub-consent-admin.php:2529 includes/class-landexhub-consent-admin.php:3529 includes/class-landexhub-consent-admin.php:4123 includes/class-landexhub-consent-services.php:51
    12611261msgid "Necessary"
    12621262msgstr ""
    … …  
    12661266msgstr ""
    12671267
     1268#: includes/class-landexhub-consent-admin.php:3936
     1269msgid "Necessary — it runs for every visitor, there is nothing to hold back"
     1270msgstr ""
     1271
     1272#: includes/class-landexhub-consent-admin.php:4146
     1273msgid "Necessary — it runs for every visitor, there is nothing to hold back."
     1274msgstr ""
     1275
    12681276#: includes/class-landexhub-consent-admin.php:631
    12691277msgid "Necessary — name"
    … …  
    12741282msgstr ""
    12751283
    1276 #: includes/class-landexhub-consent-admin.php:2931
     1284#: includes/class-landexhub-consent-admin.php:2939
    12771285msgid "Needs the free WP Consent API plugin — that is the channel it listens on."
    12781286msgstr ""
    … …  
    12821290msgstr ""
    12831291
    1284 #: includes/class-landexhub-consent-admin.php:4263
     1292#: includes/class-landexhub-consent-admin.php:4298
    12851293msgid "No issues found so far"
    12861294msgstr ""
    12871295
    1288 #: includes/class-landexhub-consent-admin.php:2730
     1296#: includes/class-landexhub-consent-admin.php:2736
    12891297msgid "No other Google tag was found in the front page HTML or from a known plugin, so Basic mode covers the Google tags found: the gtag.js that LandexHub Consent loads does not load before consent."
    12901298msgstr ""
    … …  
    13141322msgstr ""
    13151323
    1316 #: includes/class-landexhub-consent-admin.php:2913
     1324#: includes/class-landexhub-consent-admin.php:2921
    13171325msgid "None known"
    13181326msgstr ""
    … …  
    13271335msgstr ""
    13281336
    1329 #: includes/class-landexhub-consent-admin.php:2430 includes/class-landexhub-consent-admin.php:4152
     1337#: includes/class-landexhub-consent-admin.php:2430 includes/class-landexhub-consent-admin.php:4187
    13301338msgid "Not clear yet"
    13311339msgstr ""
    13321340
    1333 #: includes/class-landexhub-consent-admin.php:3523 includes/class-landexhub-consent-admin.php:4095
     1341#: includes/class-landexhub-consent-admin.php:3533 includes/class-landexhub-consent-admin.php:4126
    13341342msgid "Not governed yet"
    13351343msgstr ""
    13361344
    1337 #: includes/class-landexhub-consent-admin.php:3923
     1345#: includes/class-landexhub-consent-admin.php:3940
    13381346msgid "Not governed yet — the guide below shows how to gate it."
    13391347msgstr ""
    13401348
    1341 #: includes/class-landexhub-consent-admin.php:2970
     1349#: includes/class-landexhub-consent-admin.php:2978
    13421350msgid "Not tested by LandexHub; check it on your site."
    13431351msgstr ""
    13441352
    1345 #: includes/class-landexhub-consent-admin.php:4019
     1353#: includes/class-landexhub-consent-admin.php:4036
    13461354msgid "Note"
    13471355msgstr ""
    … …  
    13511359msgstr ""
    13521360
    1353 #: includes/class-landexhub-consent-admin.php:2568
     1361#: includes/class-landexhub-consent-admin.php:2571
    13541362msgid "nothing governs it"
    13551363msgstr ""
    13561364
    1357 #: includes/class-landexhub-consent-admin.php:4119
     1365#: includes/class-landexhub-consent-admin.php:4154
    13581366msgid "Nothing holds it back yet — the detail shows how to gate it."
    13591367msgstr ""
    … …  
    13671375msgstr ""
    13681376
    1369 #: includes/class-landexhub-consent-admin.php:4196
     1377#: includes/class-landexhub-consent-admin.php:4231
    13701378msgid "Nothing to set up here: their Google tags follow the Consent Mode signals LandexHub Consent sends. Consent integrations shows what was found on this site."
    13711379msgstr ""
    13721380
    1373 #: includes/class-landexhub-consent-admin.php:2921
     1381#: includes/class-landexhub-consent-admin.php:2929
    13741382msgid "Nothing to switch."
    13751383msgstr ""
    13761384
    13771385#. translators: %s: comma-separated list of problems.
    1378 #: includes/class-landexhub-consent-admin.php:3161 includes/class-landexhub-consent-admin.php:3230
     1386#: includes/class-landexhub-consent-admin.php:3169 includes/class-landexhub-consent-admin.php:3238
    13791387msgid "Nothing was imported. Problems found: %s"
    13801388msgstr ""
    13811389
    1382 #: includes/class-landexhub-consent-admin.php:2771
     1390#: includes/class-landexhub-consent-admin.php:2777
    13831391msgid "Nothing was saved — the service data was not valid (name, category or URL patterns)."
    13841392msgstr ""
    … …  
    13881396msgstr ""
    13891397
    1390 #: includes/class-landexhub-consent-admin.php:2962
     1398#: includes/class-landexhub-consent-admin.php:2970
    13911399msgid "Off — the plugin decides on its own."
    13921400msgstr ""
    … …  
    14201428msgstr ""
    14211429
    1422 #: includes/class-landexhub-consent-admin.php:2962
     1430#: includes/class-landexhub-consent-admin.php:2970
    14231431msgid "On — the plugin follows the visitor."
    14241432msgstr ""
    14251433
    1426 #: includes/class-landexhub-consent-admin.php:2845
     1434#: includes/class-landexhub-consent-admin.php:2853
    14271435msgid "One or the other, never both — two containers measure everything twice. Neither is mandatory."
    14281436msgstr ""
    14291437
    14301438#. translators: 1: gated occurrences, 2: all occurrences.
    1431 #: includes/class-landexhub-consent-admin.php:2540
     1439#: includes/class-landexhub-consent-admin.php:2543
    14321440msgid "only %1$d of %2$d occurrences are gated"
    14331441msgstr ""
    14341442
    1435 #: includes/class-landexhub-consent-admin.php:2895
     1443#: includes/class-landexhub-consent-admin.php:2903
    14361444msgid "Only plugins actually running here. Their tags stay theirs — LandexHub Consent just passes on what the visitor chose."
    14371445msgstr ""
    14381446
    1439 #: includes/class-landexhub-consent-admin.php:4115
     1447#: includes/class-landexhub-consent-admin.php:4150
    14401448msgid "Only some of its copies are held back; another one still loads before consent."
    14411449msgstr ""
    … …  
    14451453msgstr ""
    14461454
    1447 #: includes/class-landexhub-consent-admin.php:2638 includes/class-landexhub-consent-admin.php:2956
     1455#: includes/class-landexhub-consent-admin.php:2644 includes/class-landexhub-consent-admin.php:2964
    14481456msgid "Open settings"
    14491457msgstr ""
    … …  
    14531461msgstr ""
    14541462
    1455 #: includes/class-landexhub-consent-admin.php:4290
     1463#: includes/class-landexhub-consent-admin.php:4325
    14561464msgid "Open the consent log records"
    14571465msgstr ""
    14581466
    1459 #: includes/class-landexhub-consent-admin.php:3379
     1467#: includes/class-landexhub-consent-admin.php:3387
    14601468msgid "Open the Google settings"
    14611469msgstr ""
    … …  
    14811489msgstr ""
    14821490
    1483 #: includes/class-landexhub-consent-admin.php:4095
     1491#: includes/class-landexhub-consent-admin.php:4126
    14841492msgid "Partly governed"
    14851493msgstr ""
    14861494
    1487 #: includes/class-landexhub-consent-admin.php:2904
     1495#: includes/class-landexhub-consent-admin.php:2912
    14881496msgid "Pass consent"
    14891497msgstr ""
    … …  
    14941502
    14951503#. translators: %s: plugin name.
    1496 #: includes/class-landexhub-consent-admin.php:2948
     1504#: includes/class-landexhub-consent-admin.php:2956
    14971505msgid "Pass the visitor's decision to %s"
    14981506msgstr ""
    … …  
    15141522msgstr ""
    15151523
    1516 #: includes/class-landexhub-consent-admin.php:2902
     1524#: includes/class-landexhub-consent-admin.php:2910
    15171525msgid "Plugin"
    15181526msgstr ""
    15191527
    1520 #: includes/class-landexhub-consent-admin.php:3608 includes/class-landexhub-consent-admin.php:3701
     1528#: includes/class-landexhub-consent-admin.php:3621 includes/class-landexhub-consent-admin.php:3714
    15211529msgid "Preferences"
    15221530msgstr ""
    … …  
    15261534msgstr ""
    15271535
    1528 #: includes/class-landexhub-consent-admin.php:3534 includes/class-landexhub-consent-admin.php:3976 includes/class-landexhub-consent-frontend.php:284 includes/class-landexhub-consent-frontend.php:305
     1536#: includes/class-landexhub-consent-admin.php:3544 includes/class-landexhub-consent-admin.php:3993 includes/class-landexhub-consent-frontend.php:284 includes/class-landexhub-consent-frontend.php:305
    15291537msgid "Privacy policy"
    15301538msgstr ""
    … …  
    15501558msgstr ""
    15511559
    1552 #: includes/class-landexhub-consent-admin.php:3864
     1560#: includes/class-landexhub-consent-admin.php:3877
    15531561msgid "Re-check the site"
    15541562msgstr ""
    … …  
    15581566msgstr ""
    15591567
    1560 #: includes/class-landexhub-consent-admin.php:3011
     1568#: includes/class-landexhub-consent-admin.php:3019
    15611569msgid "Record of granted, rejected and changed consents."
    15621570msgstr ""
    … …  
    15781586msgstr ""
    15791587
    1580 #: includes/class-landexhub-consent-admin.php:3712
     1588#: includes/class-landexhub-consent-admin.php:3725
    15811589msgid "Remove from the list"
    15821590msgstr ""
    … …  
    15861594msgstr ""
    15871595
    1588 #: includes/class-landexhub-consent-admin.php:2767
     1596#: includes/class-landexhub-consent-admin.php:2773
    15891597msgid "Removed from the services list."
    15901598msgstr ""
    15911599
    1592 #: includes/class-landexhub-consent-admin.php:3664
     1600#: includes/class-landexhub-consent-admin.php:3677
    15931601msgid "Replace it with a linked preview image"
    15941602msgstr ""
    15951603
    1596 #: includes/class-landexhub-consent-admin.php:3662
     1604#: includes/class-landexhub-consent-admin.php:3675
    15971605msgid "Replace the video with a link"
    15981606msgstr ""
    15991607
    1600 #: includes/class-landexhub-consent-admin.php:3039 includes/class-landexhub-consent-admin.php:3042
     1608#: includes/class-landexhub-consent-admin.php:3047 includes/class-landexhub-consent-admin.php:3050
    16011609msgid "Reset consents"
    16021610msgstr ""
    … …  
    16071615
    16081616#. translators: %d: consent revision number.
    1609 #: includes/class-landexhub-consent-admin.php:3044
     1617#: includes/class-landexhub-consent-admin.php:3052
    16101618msgid "Revision %d"
    16111619msgstr ""
    … …  
    16191627msgstr ""
    16201628
    1621 #: includes/class-landexhub-consent-admin.php:2851 includes/class-landexhub-consent-admin.php:2996
     1629#: includes/class-landexhub-consent-admin.php:2529
     1630msgid "runs for every visitor, there is nothing to hold back"
     1631msgstr ""
     1632
     1633#: includes/class-landexhub-consent-admin.php:2859 includes/class-landexhub-consent-admin.php:3004
    16221634msgid "Save"
    16231635msgstr ""
    … …  
    16401652msgstr ""
    16411653
    1642 #: includes/class-landexhub-consent-admin.php:3688
     1654#: includes/class-landexhub-consent-admin.php:3701
    16431655msgid "Save the source to your services list so it appears on your cookie policy page under the chosen category. The list documents the source; gating is done by the steps above."
    16441656msgstr ""
    16451657
    1646 #: includes/class-landexhub-consent-admin.php:3716
     1658#: includes/class-landexhub-consent-admin.php:3729
    16471659msgid "Save to the services list"
    16481660msgstr ""
    16491661
    1650 #: includes/class-landexhub-consent-admin.php:2763
     1662#: includes/class-landexhub-consent-admin.php:2769
    16511663msgid "Saved to the services list."
    16521664msgstr ""
    … …  
    16601672msgstr ""
    16611673
    1662 #: includes/class-landexhub-consent-admin.php:3475 includes/class-landexhub-consent-admin.php:4016 includes/class-landexhub-consent-frontend.php:301
     1674#: includes/class-landexhub-consent-admin.php:3483 includes/class-landexhub-consent-admin.php:4033 includes/class-landexhub-consent-frontend.php:301
    16631675msgid "Service"
    16641676msgstr ""
    16651677
    1666 #: includes/class-landexhub-consent-admin.php:3469
     1678#: includes/class-landexhub-consent-admin.php:3477
    16671679msgid "Service inventory"
    16681680msgstr ""
    16691681
    1670 #: includes/class-landexhub-consent-admin.php:128 includes/class-landexhub-consent-admin.php:2045 includes/class-landexhub-consent-admin.php:3755 includes/class-landexhub-consent-admin.php:3887
     1682#: includes/class-landexhub-consent-admin.php:128 includes/class-landexhub-consent-admin.php:2045 includes/class-landexhub-consent-admin.php:3768 includes/class-landexhub-consent-admin.php:3903
    16711683msgid "Services"
    16721684msgstr ""
    16731685
    1674 #: includes/class-landexhub-consent-admin.php:3686
     1686#: includes/class-landexhub-consent-admin.php:3699
    16751687msgid "Services list"
    16761688msgstr ""
    … …  
    16881700msgstr ""
    16891701
    1690 #: includes/class-landexhub-consent-admin.php:3290
     1702#: includes/class-landexhub-consent-admin.php:3298
    16911703msgid "Settings imported."
    16921704msgstr ""
    … …  
    17281740
    17291741#. translators: %s: comma-separated list of setting keys.
    1730 #: includes/class-landexhub-consent-admin.php:3345
     1742#: includes/class-landexhub-consent-admin.php:3353
    17311743msgid "Some values were not valid and were not saved: %s. The previous values were kept."
    17321744msgstr ""
    17331745
    1734 #: includes/class-landexhub-consent-admin.php:4223
     1746#: includes/class-landexhub-consent-admin.php:4258
    17351747msgid "Something missing? The check reads the front page; a source that loads only on a subpage does not show up here."
    17361748msgstr ""
    17371749
    1738 #: includes/class-landexhub-consent-admin.php:2327 includes/class-landexhub-consent-admin.php:3945
     1750#: includes/class-landexhub-consent-admin.php:2327 includes/class-landexhub-consent-admin.php:3962
    17391751msgid "Source"
    17401752msgstr ""
    … …  
    17481760msgstr ""
    17491761
    1750 #: includes/class-landexhub-consent-admin.php:3943
     1762#: includes/class-landexhub-consent-admin.php:3960
    17511763msgid "Sources on this site"
    17521764msgstr ""
    17531765
    1754 #: includes/class-landexhub-consent-admin.php:3905 includes/class-landexhub-consent-admin.php:4018
     1766#: includes/class-landexhub-consent-admin.php:3920 includes/class-landexhub-consent-admin.php:4035
    17551767msgid "Status"
    17561768msgstr ""
    … …  
    17731785msgstr ""
    17741786
    1775 #: includes/class-landexhub-consent-admin.php:4306
     1787#: includes/class-landexhub-consent-admin.php:4341
    17761788msgid "Technical settings most sites never need to change. The defaults work without visiting this page."
    17771789msgstr ""
    … …  
    18141826msgstr ""
    18151827
    1816 #: includes/class-landexhub-consent-admin.php:4183
     1828#: includes/class-landexhub-consent-admin.php:4218
    18171829msgid "The container manages all Google tags. LandexHub Consent inserts it and hands it the consent first."
    18181830msgstr ""
    … …  
    18261838msgstr ""
    18271839
    1828 #: includes/class-landexhub-consent-admin.php:3246
     1840#: includes/class-landexhub-consent-admin.php:3254
    18291841msgid "the file is not a JSON export of this plugin"
    18301842msgstr ""
    18311843
    1832 #: includes/class-landexhub-consent-admin.php:3249
     1844#: includes/class-landexhub-consent-admin.php:3257
    18331845msgid "the file is not a settings export of LandexHub Consent"
    18341846msgstr ""
    … …  
    18421854msgstr ""
    18431855
    1844 #: includes/class-landexhub-consent-admin.php:2261 includes/class-landexhub-consent-admin.php:4007 includes/class-landexhub-consent-admin.php:4078
     1856#: includes/class-landexhub-consent-admin.php:2261 includes/class-landexhub-consent-admin.php:4024 includes/class-landexhub-consent-admin.php:4095
    18451857msgid "The front page could not be loaded, so it could not be checked. Try again in a moment."
    18461858msgstr ""
    … …  
    18601872
    18611873#. translators: %s: what went wrong.
    1862 #: includes/class-landexhub-consent-admin.php:3228
     1874#: includes/class-landexhub-consent-admin.php:3236
    18631875msgid "The import was only partly applied: %s. Check the settings and the services list."
    18641876msgstr ""
    18651877
    1866 #: includes/class-landexhub-consent-admin.php:3619
     1878#: includes/class-landexhub-consent-admin.php:3632
    18671879msgid "the original script body stays unchanged"
    18681880msgstr ""
    … …  
    18971909msgstr ""
    18981910
    1899 #: includes/class-landexhub-consent-admin.php:3178
     1911#: includes/class-landexhub-consent-admin.php:3186
    19001912msgid "the services could not be stored"
    19011913msgstr ""
    … …  
    19091921msgstr ""
    19101922
    1911 #: includes/class-landexhub-consent-admin.php:3189
     1923#: includes/class-landexhub-consent-admin.php:3197
    19121924msgid "the settings could not be stored"
    19131925msgstr ""
    19141926
    1915 #: includes/class-landexhub-consent-admin.php:3187
     1927#: includes/class-landexhub-consent-admin.php:3195
    19161928msgid "the settings could not be stored and the previous services list could not be restored, so the imported services are in use with the previous settings"
    19171929msgstr ""
    … …  
    19221934msgstr ""
    19231935
    1924 #: includes/class-landexhub-consent-admin.php:4216
     1936#: includes/class-landexhub-consent-admin.php:4251
    19251937msgid "The site check found no measurement. The consent bar works without it — you do not have to add anything."
    19261938msgstr ""
    19271939
    1928 #: includes/class-landexhub-consent-admin.php:4260
     1940#: includes/class-landexhub-consent-admin.php:4295
    19291941msgid "the specific steps are with each issue below."
    19301942msgstr ""
    19311943
    19321944#. translators: %s: Universal Analytics ID, e.g. UA-12345-1.
    1933 #: includes/class-landexhub-consent-admin.php:3375
     1945#: includes/class-landexhub-consent-admin.php:3383
    19341946msgid "The stored measurement ID %s is a Universal Analytics ID. Google no longer processes Universal Analytics data, so LandexHub Consent does not load it. Enter a Google Analytics 4 ID (G-…) instead, or choose “Nothing” to remove it."
    19351947msgstr ""
    19361948
    1937 #: includes/class-landexhub-consent-admin.php:2738
     1949#: includes/class-landexhub-consent-admin.php:2744
    19381950msgid "The switch only controls the gtag.js that LandexHub Consent loads. These load regardless of it:"
    19391951msgstr ""
    … …  
    19471959msgstr ""
    19481960
    1949 #: includes/class-landexhub-consent-admin.php:3143
     1961#: includes/class-landexhub-consent-admin.php:3151
    19501962msgid "the uploaded file could not be read"
    19511963msgstr ""
    19521964
    1953 #: includes/class-landexhub-consent-admin.php:3663
     1965#: includes/class-landexhub-consent-admin.php:3676
    19541966msgid "The visitor leaves for the service; nothing loads on your site."
    19551967msgstr ""
    … …  
    19631975msgstr ""
    19641976
    1965 #: includes/class-landexhub-consent-admin.php:3890
     1977#: includes/class-landexhub-consent-admin.php:3906
    19661978msgid "This service is not on the list any more."
    19671979msgstr ""
    19681980
    1969 #: includes/class-landexhub-consent-admin.php:4215
     1981#: includes/class-landexhub-consent-admin.php:4250
    19701982msgid "This site does not measure anything yet"
    19711983msgstr ""
    … …  
    19751987msgstr ""
    19761988
    1977 #: includes/class-landexhub-consent-admin.php:3692
     1989#: includes/class-landexhub-consent-admin.php:3705
    19781990msgid "This source is already in your services list — saving updates the entry."
    19791991msgstr ""
    … …  
    19871999msgstr ""
    19882000
    1989 #: includes/class-landexhub-consent-admin.php:3029
     2001#: includes/class-landexhub-consent-admin.php:3037
    19902002msgid "Tools"
    19912003msgstr ""
    … …  
    20162028msgstr ""
    20172029
    2018 #: includes/class-landexhub-consent-admin.php:4057 includes/class-landexhub-consent-admin.php:4092
     2030#: includes/class-landexhub-consent-admin.php:4074 includes/class-landexhub-consent-admin.php:4120
    20192031msgid "Unassigned"
    20202032msgstr ""
    20212033
    2022 #: includes/class-landexhub-consent-admin.php:4053
     2034#: includes/class-landexhub-consent-admin.php:4070
    20232035msgid "Unassigned — not in the catalog or in your services list"
    20242036msgstr ""
    … …  
    20322044msgstr ""
    20332045
    2034 #: includes/class-landexhub-consent-admin.php:2991
     2046#: includes/class-landexhub-consent-admin.php:2999
    20352047msgid "Until WP Consent API is installed nothing changes — those plugins keep behaving exactly as they do now."
    20362048msgstr ""
    … …  
    20412053msgstr ""
    20422054
    2043 #: includes/class-landexhub-consent-admin.php:3666
     2055#: includes/class-landexhub-consent-admin.php:3679
    20442056msgid "Use a click-to-load plugin"
    20452057msgstr ""
    20462058
    20472059#. translators: %s: the container or measurement ID that stays active.
    2048 #: includes/class-landexhub-consent-admin.php:3440
     2060#: includes/class-landexhub-consent-admin.php:3448
    20492061msgid "Use either a GTM container or a gtag.js ID, not both — two containers would measure everything twice. Keeping %s and clearing the other field."
    20502062msgstr ""
    … …  
    20542066msgstr ""
    20552067
    2056 #: includes/class-landexhub-consent-admin.php:4195
     2068#: includes/class-landexhub-consent-admin.php:4230
    20572069msgid "Using Site Kit or MonsterInsights?"
    20582070msgstr ""
    … …  
    20622074msgstr ""
    20632075
    2064 #: includes/class-landexhub-consent-admin.php:3623
     2076#: includes/class-landexhub-consent-admin.php:3636
    20652077msgid "Verify the edit"
    20662078msgstr ""
    … …  
    20862098msgstr ""
    20872099
    2088 #: includes/class-landexhub-consent-admin.php:995 includes/class-landexhub-consent-admin.php:2844
     2100#: includes/class-landexhub-consent-admin.php:995 includes/class-landexhub-consent-admin.php:2852
    20892101msgid "What LandexHub Consent adds to the site"
    20902102msgstr ""
    … …  
    20942106msgstr ""
    20952107
    2096 #: includes/class-landexhub-consent-admin.php:3756 includes/class-landexhub-consent-admin.php:3901
     2108#: includes/class-landexhub-consent-admin.php:3769 includes/class-landexhub-consent-admin.php:3916
    20972109msgid "What this site uses and how consent governs it."
    20982110msgstr ""
    … …  
    21022114msgstr ""
    21032115
    2104 #: includes/class-landexhub-consent-admin.php:2328 includes/class-landexhub-consent-admin.php:3946
     2116#: includes/class-landexhub-consent-admin.php:2328 includes/class-landexhub-consent-admin.php:3963
    21052117msgid "Who adds it"
    21062118msgstr ""
    21072119
    2108 #: includes/class-landexhub-consent-admin.php:2894
     2120#: includes/class-landexhub-consent-admin.php:2902
    21092121msgid "Who LandexHub Consent passes consent to"
    21102122msgstr ""
    … …  
    21312143msgstr ""
    21322144
    2133 #: includes/class-landexhub-consent-admin.php:2980
     2145#: includes/class-landexhub-consent-admin.php:2988
    21342146msgid "WP Consent API is a shared channel: while it is installed, LandexHub Consent is the consent manager for every plugin here that reads it."
    21352147msgstr ""
    21362148
    2137 #: includes/class-landexhub-consent-admin.php:2382 includes/class-landexhub-consent-admin.php:2557
     2149#: includes/class-landexhub-consent-admin.php:2382 includes/class-landexhub-consent-admin.php:2560
    21382150msgid "written into the page"
    21392151msgstr ""
    … …  
    21432155msgstr ""
    21442156
    2145 #: includes/class-landexhub-consent-admin.php:4185
     2157#: includes/class-landexhub-consent-admin.php:4220
    21462158msgid "You will find the ID in Tag Manager, top right."
    21472159msgstr ""
    21482160
    2149 #: includes/class-landexhub-consent-admin.php:2710
     2161#: includes/class-landexhub-consent-admin.php:2716
    21502162msgid "your GTM container — it always loads; what each tag does before consent is decided in GTM"
    21512163msgstr ""
  • landexhub-consent/trunk/readme.txt

    r3758640 r3762168  
    55Tested up to: 7.1
    66Requires PHP: 7.4
    7 Stable tag: 0.9.2
     7Stable tag: 0.9.3
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
    … …  
    4646This plugin does not call home and sends no telemetry. Depending on what **you** configure, it talks to the following services:
    4747
    48 **Google Tag Manager / Google tag (gtag.js)** — optional, disabled by default. If you enter your own GTM container ID or gtag.js measurement ID in the plugin settings, the plugin embeds the standard Google snippet, and every visitor's browser then loads the tag from `www.googletagmanager.com` (requests `gtm.js` or `gtag/js`). This is required for the measurement you configured to work. The plugin prints the Google Consent Mode v2 `denied` default before these tags, unless a developer turns that default off with the `landexhub_consent_emit_consent_default` filter. No `<noscript>` fallback is printed, so visitors without JavaScript load nothing from Google. What Google receives with those requests (IP address, user agent, page URL, consent state signals) is described in Google's documentation: [Google Terms of Service](https://policies.google.com/terms), [Google Privacy Policy](https://policies.google.com/privacy). If you leave the setting empty, nothing is loaded from Google by this plugin.
     48**Google Tag Manager / Google tag (gtag.js)** — optional, disabled by default. If you enter your own GTM container ID or gtag.js measurement ID in the plugin settings, the plugin embeds the standard Google snippet, and every visitor's browser then loads the tag from `www.googletagmanager.com` (requests `gtm.js` or `gtag/js`). This is required for the measurement you configured to work. The plugin prints the Google Consent Mode v2 `denied` default before these tags, unless a developer turns that default off with the `landexhub_consent_emit_consent_default` filter. With a GTM container the plugin also prints Google's `<noscript>` frame right after the opening `<body>` tag (in themes that call `wp_body_open()`), as in Google's installation instructions: visitors without JavaScript then load `ns.html` from `www.googletagmanager.com`. Without JavaScript there is no consent bar and no Consent Mode default, so that request carries no consent state. What Google receives with those requests (IP address, user agent, page URL, consent state signals) is described in Google's documentation: [Google Terms of Service](https://policies.google.com/terms), [Google Privacy Policy](https://policies.google.com/privacy). If you leave the setting empty, nothing is loaded from Google by this plugin.
    4949
    5050**Your own site (loopback)** — the site check fetches your own homepage over HTTP (a loopback request to your own server) to scan the HTML for third-party scripts and the Google tag order. No external service is involved.
    … …  
    119119== Changelog ==
    120120
     121= 0.9.3 =
     122* "Verify the edit" in the gating guide checks the site again and returns to the page you started from (the service detail or Services), not to a page that has no menu entry.
     123* A source saved to the services list from an inline snippet (for example the Meta Pixel) is matched to its catalog service, so it is listed once in Services and on the cookie policy page. Entries saved this way in 0.9.2 are now shown with their catalog service too.
     124* Services the catalog files as necessary (Stripe, PayPal, Google reCAPTCHA, Cloudflare Turnstile) are shown as "Necessary": they no longer count as needing attention, are not reported as loading before consent and are not offered for gating.
     125* Google tags follow Google's installation snippets: the GTM container also prints its `<noscript>` frame right after the opening `<body>` tag, and gtag.js in Advanced mode loads with `async`, followed by its config. The plugin's own tags only add an `id` attribute.
     126* The `landexhub_consent_update` dataLayer event now comes after GTM's `gtm.js` event whenever the container starts while the page loads, also when the theme or another plugin prints it after the LandexHub Consent script, so GTM triggers on it fire. A container that starts only after the page has loaded (for example one delayed by an optimisation plugin) still gets the event before `gtm.js`. The Consent Mode update with a returning visitor's choice still goes out at once, before the container's first tag.
     127
    121128= 0.9.2 =
    122129* The consent log retention is now a setting: keep records for 3 months up to 5 years, or until you delete them (default 12 months).
    … …  
    149156== Upgrade Notice ==
    150157
     158= 0.9.3 =
     159GTM triggers on the consent event fire wherever the container is printed in the page. Fixes in the Services page: "Verify the edit" returns to the service, no duplicate rows for inline sources, necessary services are not reported as problems.
     160
    151161= 0.9.2 =
    152162Configurable consent log retention, opt-in credit link and stricter settings validation.
  • landexhub-consent/trunk/src/consent.ts

    r3758640 r3762168  
    427427    // that outlived the visitor's choice (it expired, or the cookie was removed).
    428428    pushWpConsent(state, "none" === source);
     429    // The signals go out at once, so GTM knows a returning visitor's choice before its first tag.
    429430    gtag("consent", "update", signals(state));
    430431    const ev: { [key: string]: unknown } = { event: cfg.dataLayer!.onUpdate };
    431432    ev.landexhub_consent = catBooleans(state);
    432433    ev.landexhub_consent_source = source;
    433     (w.dataLayer as unknown[]).push(ev);
     434    // The event is meant for GTM triggers, which never see an event that comes before GTM's
     435    // gtm.js. A page-load event usually does, a choice made in the bar only rarely.
     436    afterGtmStart(function () { (w.dataLayer as unknown[]).push(ev); });
     437  }
     438
     439  // Runs fn once the GTM container has started: right away when its gtm.js event is already
     440  // in the dataLayer, otherwise just after the GTM snippet pushes it, whether the snippet
     441  // comes before or after this script. Without GTM on the page fn runs once the page has
     442  // loaded, so other listeners still get the event.
     443  function afterGtmStart(fn: () => void): void {
     444    const dl = w.dataLayer as { [key: string]: unknown }[];
     445    const started = function (e: unknown): boolean {
     446      return !!e && typeof e === "object" && (e as { event?: unknown }).event === "gtm.js";
     447    };
     448    if (dl.some(started) || "complete" === d.readyState) {
     449      fn();
     450      return;
     451    }
     452    let done = false;
     453    const run = function (): void {
     454      if (done) return;
     455      done = true;
     456      if (dl.push === wrapped) dl.push = original;
     457      fn();
     458    };
     459    const original = dl.push;
     460    const wrapped = function (this: unknown, ...items: { [key: string]: unknown }[]): number {
     461      const n = original.apply(dl, items);
     462      if (!done && items.some(started)) run();
     463      return n;
     464    };
     465    dl.push = wrapped;
     466    w.addEventListener("load", run);
    434467  }
    435468  function persist(state: ConsentState): void {
Note: See TracChangeset for help on using the changeset viewer.