@owlmeans/consent 0.1.18-rc.8 → 0.1.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +229 -0
- package/build/consts.d.ts +84 -23
- package/build/consts.d.ts.map +1 -1
- package/build/consts.js +110 -29
- package/build/consts.js.map +1 -1
- package/build/consts.local.d.ts +12 -0
- package/build/consts.local.d.ts.map +1 -0
- package/build/consts.local.js +12 -0
- package/build/consts.local.js.map +1 -0
- package/build/geo/types.d.ts +47 -0
- package/build/geo/types.d.ts.map +1 -0
- package/build/geo/types.js +2 -0
- package/build/geo/types.js.map +1 -0
- package/build/geo.d.ts +4 -0
- package/build/geo.d.ts.map +1 -0
- package/build/geo.js +96 -0
- package/build/geo.js.map +1 -0
- package/build/gtobserver/types.d.ts +75 -0
- package/build/gtobserver/types.d.ts.map +1 -0
- package/build/gtobserver/types.js +2 -0
- package/build/gtobserver/types.js.map +1 -0
- package/build/gtobserver.d.ts +7 -0
- package/build/gtobserver.d.ts.map +1 -0
- package/build/gtobserver.js +142 -0
- package/build/gtobserver.js.map +1 -0
- package/build/i18n/be.json +9 -4
- package/build/i18n/de.json +9 -4
- package/build/i18n/en.json +9 -4
- package/build/i18n/es.json +9 -4
- package/build/i18n/fr.json +9 -4
- package/build/i18n/pl.json +9 -4
- package/build/i18n/ru.json +9 -4
- package/build/i18n/types.d.ts +11 -0
- package/build/i18n/types.d.ts.map +1 -0
- package/build/i18n/types.js +2 -0
- package/build/i18n/types.js.map +1 -0
- package/build/i18n/uk.json +9 -4
- package/build/i18n.d.ts +4 -14
- package/build/i18n.d.ts.map +1 -1
- package/build/i18n.js +12 -27
- package/build/i18n.js.map +1 -1
- package/build/index.d.ts +13 -6
- package/build/index.d.ts.map +1 -1
- package/build/index.js +5 -4
- package/build/index.js.map +1 -1
- package/build/linker/types.d.ts +59 -0
- package/build/linker/types.d.ts.map +1 -0
- package/build/linker/types.js +2 -0
- package/build/linker/types.js.map +1 -0
- package/build/linker.d.ts +5 -76
- package/build/linker.d.ts.map +1 -1
- package/build/linker.js +290 -339
- package/build/linker.js.map +1 -1
- package/build/plugins/types.d.ts +42 -0
- package/build/plugins/types.d.ts.map +1 -0
- package/build/plugins/types.js +2 -0
- package/build/plugins/types.js.map +1 -0
- package/build/plugins.d.ts +4 -69
- package/build/plugins.d.ts.map +1 -1
- package/build/plugins.js +73 -62
- package/build/plugins.js.map +1 -1
- package/build/storage/types.d.ts +31 -0
- package/build/storage/types.d.ts.map +1 -0
- package/build/storage/types.js +2 -0
- package/build/storage/types.js.map +1 -0
- package/build/storage.d.ts +6 -22
- package/build/storage.d.ts.map +1 -1
- package/build/storage.js +72 -81
- package/build/storage.js.map +1 -1
- package/build/store.d.ts +2 -2
- package/build/store.d.ts.map +1 -1
- package/build/store.js +116 -67
- package/build/store.js.map +1 -1
- package/build/types.d.ts +147 -26
- package/build/types.d.ts.map +1 -1
- package/build/types.local.d.ts +9 -0
- package/build/types.local.d.ts.map +1 -0
- package/build/types.local.js +2 -0
- package/build/types.local.js.map +1 -0
- package/package.json +3 -3
- package/src/consts.local.ts +16 -0
- package/src/consts.ts +126 -34
- package/src/geo/types.ts +49 -0
- package/src/geo.ts +122 -0
- package/src/gtobserver/types.ts +73 -0
- package/src/gtobserver.ts +182 -0
- package/src/i18n/be.json +9 -4
- package/src/i18n/de.json +9 -4
- package/src/i18n/en.json +9 -4
- package/src/i18n/es.json +9 -4
- package/src/i18n/fr.json +9 -4
- package/src/i18n/pl.json +9 -4
- package/src/i18n/ru.json +9 -4
- package/src/i18n/types.ts +11 -0
- package/src/i18n/uk.json +9 -4
- package/src/i18n.ts +20 -32
- package/src/index.ts +13 -13
- package/src/linker/types.ts +59 -0
- package/src/linker.ts +301 -364
- package/src/plugins/types.ts +42 -0
- package/src/plugins.ts +82 -106
- package/src/storage/types.ts +31 -0
- package/src/storage.ts +75 -77
- package/src/store.ts +122 -69
- package/src/types.local.ts +9 -0
- package/src/types.ts +153 -25
- package/tests/consent.spec.ts +26 -28
- package/tests/geo.spec.ts +474 -0
- package/tests/linker.spec.ts +144 -309
- package/tests/tracking.spec.ts +14 -14
- package/build/functional.d.ts +0 -35
- package/build/functional.d.ts.map +0 -1
- package/build/functional.js +0 -67
- package/build/functional.js.map +0 -1
- package/build/gtm.d.ts +0 -72
- package/build/gtm.d.ts.map +0 -1
- package/build/gtm.js +0 -182
- package/build/gtm.js.map +0 -1
- package/src/functional.ts +0 -73
- package/src/gtm.ts +0 -220
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { ConsentGeoPlugin, ConsentOptions, ConsentRecord } from '../types.js';
|
|
2
|
+
/** What locating the visitor decided: ask them, or decide for them automatically. */
|
|
3
|
+
export type ConsentGeoVerdict = 'ask' | 'auto';
|
|
4
|
+
/** Whether a record is an automatic decision, and whether it is still trusted. */
|
|
5
|
+
export type ConsentAutoState = 'fresh' | 'stale';
|
|
6
|
+
/**
|
|
7
|
+
* Asking only where the law requires it: locating the visitor, the decision that follows, and the
|
|
8
|
+
* automatic record written where nobody needs to be asked.
|
|
9
|
+
*/
|
|
10
|
+
export interface ConsentGeoHelper {
|
|
11
|
+
/** Whether `opts.geo` turns the gate on AND something can answer — the Cloudflare locator or a plugin. */
|
|
12
|
+
enabled: (opts?: ConsentOptions) => boolean;
|
|
13
|
+
/** Every `key=value` line of a Cloudflare trace body. Never throws; anything else parses to `{}`. */
|
|
14
|
+
parseTrace: (text: string) => Record<string, string>;
|
|
15
|
+
/**
|
|
16
|
+
* The built-in locator: a same-origin GET of the trace endpoint, cookies left out, never cached.
|
|
17
|
+
* Rejects when `opts.geo.cloudflare` is off, the request fails or answers non-2xx, or the body is
|
|
18
|
+
* not a trace (an SPA serving its `index.html` for every path answers 200 here).
|
|
19
|
+
*/
|
|
20
|
+
cloudflareLocator: () => ConsentGeoPlugin;
|
|
21
|
+
/**
|
|
22
|
+
* Whether a visitor located in `country` must be asked: yes inside `opts.geo.countries`
|
|
23
|
+
* (`CONSENT_REQUIRED_COUNTRIES`), and yes for anything that names no country.
|
|
24
|
+
*/
|
|
25
|
+
requiresConsent: (country: string | null, opts?: ConsentOptions) => boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Locate and decide, bounded by `opts.geo.timeout`. Never rejects: a visitor nobody could locate
|
|
28
|
+
* resolves `'ask'`.
|
|
29
|
+
*/
|
|
30
|
+
decide: (opts: ConsentOptions) => Promise<ConsentGeoVerdict>;
|
|
31
|
+
/**
|
|
32
|
+
* Whether the browser sends Global Privacy Control — a legally binding opt-out in several US
|
|
33
|
+
* states, so an automatic decision honours it.
|
|
34
|
+
*/
|
|
35
|
+
privacySignal: () => boolean;
|
|
36
|
+
/**
|
|
37
|
+
* The automatic decision for a visitor nobody needs to ask: every category on — or, under Global
|
|
38
|
+
* Privacy Control, only the required ones — stamped `auto` with the current time.
|
|
39
|
+
*/
|
|
40
|
+
automaticRecord: (opts?: ConsentOptions) => ConsentRecord;
|
|
41
|
+
/**
|
|
42
|
+
* `fresh` for an automatic decision younger than `CONSENT_AUTO_MAX_AGE`, `stale` for an older one
|
|
43
|
+
* (or one stamped in the future beyond the skew), `null` for an explicit record or none.
|
|
44
|
+
*/
|
|
45
|
+
autoState: (record: ConsentRecord | null) => ConsentAutoState | null;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/geo/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAElF,qFAAqF;AACrF,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,MAAM,CAAA;AAE9C,kFAAkF;AAClF,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,OAAO,CAAA;AAEhD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0GAA0G;IAC1G,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,cAAc,KAAK,OAAO,CAAA;IAC3C,qGAAqG;IACrG,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpD;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;IACzC;;;OAGG;IACH,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,cAAc,KAAK,OAAO,CAAA;IAC3E;;;OAGG;IACH,MAAM,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC5D;;;OAGG;IACH,aAAa,EAAE,MAAM,OAAO,CAAA;IAC5B;;;OAGG;IACH,eAAe,EAAE,CAAC,IAAI,CAAC,EAAE,cAAc,KAAK,aAAa,CAAA;IACzD;;;OAGG;IACH,SAAS,EAAE,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,KAAK,gBAAgB,GAAG,IAAI,CAAA;CACrE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/geo/types.ts"],"names":[],"mappings":""}
|
package/build/geo.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geo.d.ts","sourceRoot":"","sources":["../src/geo.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAoB,gBAAgB,EAAqB,MAAM,gBAAgB,CAAA;AAE3F,eAAO,MAAM,sBAAsB,QAAO,gBA2GzC,CAAA;AAED,eAAO,MAAM,gBAAgB,kBAA2B,CAAA"}
|
package/build/geo.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { CONSENT_AUTO_MAX_AGE, CONSENT_GEO_TIMEOUT, CONSENT_GEO_UNKNOWN, CONSENT_REQUIRED_COUNTRIES, CONSENT_SCHEMA_VERSION, CONSENT_TRACE_PATH, DEFAULT_CONSENT_CATEGORIES, } from './consts.js';
|
|
2
|
+
import { AUTO_SKEW, CLOUDFLARE_LOCATOR_ALIAS, CLOUDFLARE_LOCATOR_PRIORITY, COUNTRY_CODE, } from './consts.local.js';
|
|
3
|
+
import { consentPluginHelper } from './plugins.js';
|
|
4
|
+
export const createConsentGeoHelper = () => {
|
|
5
|
+
const now = () => Math.floor(Date.now() / 1000);
|
|
6
|
+
const enabled = (opts) => {
|
|
7
|
+
const geo = opts?.geo;
|
|
8
|
+
if (geo == null) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
return (geo.cloudflare != null && geo.cloudflare !== false)
|
|
12
|
+
|| consentPluginHelper.consentPlugins().some(plugin => plugin.locate != null
|
|
13
|
+
&& plugin.alias !== CLOUDFLARE_LOCATOR_ALIAS);
|
|
14
|
+
};
|
|
15
|
+
const parseTrace = (text) => {
|
|
16
|
+
const trace = {};
|
|
17
|
+
for (const line of text.split(/\r?\n/)) {
|
|
18
|
+
const at = line.indexOf('=');
|
|
19
|
+
if (at > 0 && /^[a-z_]+$/.test(line.slice(0, at))) {
|
|
20
|
+
trace[line.slice(0, at)] = line.slice(at + 1).trim();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return trace;
|
|
24
|
+
};
|
|
25
|
+
const cloudflareLocator = () => ({
|
|
26
|
+
alias: CLOUDFLARE_LOCATOR_ALIAS,
|
|
27
|
+
priority: CLOUDFLARE_LOCATOR_PRIORITY,
|
|
28
|
+
locate: async (opts) => {
|
|
29
|
+
const setting = opts.geo?.cloudflare;
|
|
30
|
+
if (setting == null || setting === false) {
|
|
31
|
+
throw new Error('consent:geo:cloudflare:off');
|
|
32
|
+
}
|
|
33
|
+
if (typeof fetch !== 'function') {
|
|
34
|
+
throw new Error('consent:geo:cloudflare:no-fetch');
|
|
35
|
+
}
|
|
36
|
+
const path = typeof setting === 'object' ? setting.path ?? CONSENT_TRACE_PATH : CONSENT_TRACE_PATH;
|
|
37
|
+
const response = await fetch(path, { credentials: 'omit', cache: 'no-store' });
|
|
38
|
+
if (!response.ok) {
|
|
39
|
+
throw new Error(`consent:geo:cloudflare:status:${response.status}`);
|
|
40
|
+
}
|
|
41
|
+
const trace = parseTrace(await response.text());
|
|
42
|
+
// Every trace names the edge that answered; an HTML fallback page names nothing at all.
|
|
43
|
+
if (trace.loc == null || (trace.colo == null && trace.fl == null)) {
|
|
44
|
+
throw new Error('consent:geo:cloudflare:not-a-trace');
|
|
45
|
+
}
|
|
46
|
+
return { country: trace.loc };
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
const requiresConsent = (country, opts) => {
|
|
50
|
+
const code = country?.trim().toUpperCase() ?? '';
|
|
51
|
+
if (!COUNTRY_CODE.test(code) || CONSENT_GEO_UNKNOWN.includes(code)) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
return (opts?.geo?.countries ?? CONSENT_REQUIRED_COUNTRIES)
|
|
55
|
+
.some(candidate => candidate.toUpperCase() === code);
|
|
56
|
+
};
|
|
57
|
+
const decide = async (opts) => {
|
|
58
|
+
let timer;
|
|
59
|
+
const timeout = new Promise((_, reject) => {
|
|
60
|
+
timer = setTimeout(() => reject(new Error('consent:geo:timeout')), opts.geo?.timeout ?? CONSENT_GEO_TIMEOUT);
|
|
61
|
+
});
|
|
62
|
+
try {
|
|
63
|
+
const location = await Promise.race([consentPluginHelper.locateConsent(opts), timeout]);
|
|
64
|
+
return requiresConsent(location.country, opts) ? 'ask' : 'auto';
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return 'ask';
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
clearTimeout(timer);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
const privacySignal = () => typeof navigator !== 'undefined'
|
|
74
|
+
&& navigator.globalPrivacyControl === true;
|
|
75
|
+
const automaticRecord = (opts) => {
|
|
76
|
+
const optOut = privacySignal();
|
|
77
|
+
const record = { v: CONSENT_SCHEMA_VERSION, auto: now() };
|
|
78
|
+
for (const category of opts?.categories ?? DEFAULT_CONSENT_CATEGORIES) {
|
|
79
|
+
record[category.key] = category.required === true || !optOut;
|
|
80
|
+
}
|
|
81
|
+
return record;
|
|
82
|
+
};
|
|
83
|
+
const autoState = (record) => {
|
|
84
|
+
if (record == null || typeof record.auto !== 'number') {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
const age = now() - record.auto;
|
|
88
|
+
return age <= CONSENT_AUTO_MAX_AGE && age >= -AUTO_SKEW ? 'fresh' : 'stale';
|
|
89
|
+
};
|
|
90
|
+
return {
|
|
91
|
+
enabled, parseTrace, cloudflareLocator, requiresConsent, decide, privacySignal, automaticRecord,
|
|
92
|
+
autoState,
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
export const consentGeoHelper = createConsentGeoHelper();
|
|
96
|
+
//# sourceMappingURL=geo.js.map
|
package/build/geo.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geo.js","sourceRoot":"","sources":["../src/geo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { ConsentCategory, ConsentOptions, ConsentRecord } from '../types.js';
|
|
2
|
+
/** Google Consent Mode: the queue, the signals a decision implies, and the inline scripts. */
|
|
3
|
+
export interface ConsentModeHelper {
|
|
4
|
+
/**
|
|
5
|
+
* Push onto the tag-manager queue in the shape Google's own snippet uses.
|
|
6
|
+
*
|
|
7
|
+
* `arguments`, not an array literal. Both work with today's Consent API, but `arguments` is what
|
|
8
|
+
* `gtag.js` itself emits, and a page that carries both this and Google's snippet should not have
|
|
9
|
+
* two shapes in one queue.
|
|
10
|
+
*/
|
|
11
|
+
gtagConsent: (..._args: unknown[]) => void;
|
|
12
|
+
/** Every signal the configured categories drive, at its pre-consent value. */
|
|
13
|
+
consentDefaults: (categories?: ConsentCategory[]) => Record<string, 'granted' | 'denied'>;
|
|
14
|
+
/** Every signal, at the value this record implies. */
|
|
15
|
+
consentUpdate: (record: ConsentRecord, categories?: ConsentCategory[]) => Record<string, 'granted' | 'denied'>;
|
|
16
|
+
/**
|
|
17
|
+
* Declare what is denied, before any tag can act.
|
|
18
|
+
*
|
|
19
|
+
* Idempotent through a window flag, because the page may carry this call twice — once inline in
|
|
20
|
+
* the document head, once from whatever bundle mounts the dialog — and a second `default` after a
|
|
21
|
+
* tag has loaded is worse than none: it can widen what was already narrowed.
|
|
22
|
+
*/
|
|
23
|
+
pushConsentDefaults: (opts?: ConsentOptions) => void;
|
|
24
|
+
/**
|
|
25
|
+
* Apply a decision: globals first, then the signal update, then any per-category events.
|
|
26
|
+
*
|
|
27
|
+
* The order is load-bearing. A tag that fires on the update event reads the globals in the same
|
|
28
|
+
* turn, so writing them afterwards would let the first firing see the previous answer.
|
|
29
|
+
*/
|
|
30
|
+
applyConsent: (record: ConsentRecord, opts?: ConsentOptions) => void;
|
|
31
|
+
/**
|
|
32
|
+
* Whether a stored decision grants tracking at all — a signal-bearing category, not merely the
|
|
33
|
+
* required essential one.
|
|
34
|
+
*
|
|
35
|
+
* "Signal-bearing" is what a required category can never be: it exists to gate whether a LOADER
|
|
36
|
+
* runs, and a required category is disclosure, not a question — everyone gets it. Only a category
|
|
37
|
+
* that both is optional and drives at least one Consent Mode signal counts, which is exactly what
|
|
38
|
+
* `googleTagHeadScript`'s `'basic'` mode gates a Google tag behind.
|
|
39
|
+
*/
|
|
40
|
+
trackingGranted: (record: ConsentRecord | null, categories?: ConsentCategory[]) => boolean;
|
|
41
|
+
/**
|
|
42
|
+
* The inline script a document stamps ABOVE its tag-manager snippet.
|
|
43
|
+
*
|
|
44
|
+
* It exists because the defaults have to be on the queue before `gtm.js` loads, and a React bundle
|
|
45
|
+
* cannot be: by the time an island mounts, the container has been running for hundreds of
|
|
46
|
+
* milliseconds and has already decided what it may do. Emitting it from the HTML is the only
|
|
47
|
+
* ordering that holds — and it reads the stored record too, so a returning visitor's tags are not
|
|
48
|
+
* denied for the first paint of every page.
|
|
49
|
+
*/
|
|
50
|
+
consentBootstrapScript: (opts?: ConsentOptions) => string;
|
|
51
|
+
/**
|
|
52
|
+
* Withhold a loader until a stored or later decision grants tracking.
|
|
53
|
+
*
|
|
54
|
+
* The counterpart to `consentBootstrapScript` for the `'basic'` gated loading mode
|
|
55
|
+
* (`@owlmeans/web-gtm`'s `GOOGLE_TAG_DEFAULT_MODE`): where the bootstrap always declares Consent
|
|
56
|
+
* Mode's defaults so a tag may load cookieless, this withholds the tag itself — the loader string
|
|
57
|
+
* is only ever reached once `trackingGranted` is true, either because a returning visitor's stored
|
|
58
|
+
* record already says so, or because `applyConsent` later dispatches {@link CONSENT_EVENT} with
|
|
59
|
+
* one that does. The listener removes itself on the first passing event, so the loader — which
|
|
60
|
+
* marks its own element and refuses to run twice — is asked to run at most once from here.
|
|
61
|
+
*
|
|
62
|
+
* `loaderExpr` is a complete statement or expression that runs the loader when reached — the
|
|
63
|
+
* self-invoking IIFE string `googleTagHeadScript`'s `gtagScript`/`gtmContainerScript` already
|
|
64
|
+
* produce, embedded here verbatim rather than called. It is placed inline exactly as
|
|
65
|
+
* `consentBootstrapScript`'s own output is: dynamic values (the storage key, the category shape,
|
|
66
|
+
* the event name) are JSON-encoded so nothing configured can break out of a string literal, and
|
|
67
|
+
* escaping the RESULT for HTML (`</script`, `<!--`) is left to whoever composes the final inline
|
|
68
|
+
* script — the same discipline `consentBootstrapScript` follows, and `googleTagHeadScript` already
|
|
69
|
+
* applies to the whole script it stamps.
|
|
70
|
+
*/
|
|
71
|
+
consentGateScript: (loaderExpr: string, opts?: ConsentOptions & {
|
|
72
|
+
categories?: ConsentCategory[];
|
|
73
|
+
}) => string;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/gtobserver/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEjF,8FAA8F;AAC9F,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,WAAW,EAAE,CAAC,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;IAC1C,8EAA8E;IAC9E,eAAe,EAAE,CAAC,UAAU,CAAC,EAAE,eAAe,EAAE,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAA;IACzF,sDAAsD;IACtD,aAAa,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,eAAe,EAAE,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAA;IAC9G;;;;;;OAMG;IACH,mBAAmB,EAAE,CAAC,IAAI,CAAC,EAAE,cAAc,KAAK,IAAI,CAAA;IACpD;;;;;OAKG;IACH,YAAY,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,cAAc,KAAK,IAAI,CAAA;IACpE;;;;;;;;OAQG;IACH,eAAe,EAAE,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,EAAE,UAAU,CAAC,EAAE,eAAe,EAAE,KAAK,OAAO,CAAA;IAC1F;;;;;;;;OAQG;IACH,sBAAsB,EAAE,CAAC,IAAI,CAAC,EAAE,cAAc,KAAK,MAAM,CAAA;IACzD;;;;;;;;;;;;;;;;;;;OAmBG;IACH,iBAAiB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG;QAAE,UAAU,CAAC,EAAE,eAAe,EAAE,CAAA;KAAE,KAAK,MAAM,CAAA;CAC9G"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/gtobserver/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ConsentOptions } from './types.js';
|
|
2
|
+
import type { ConsentModeHelper } from './gtobserver/types.js';
|
|
3
|
+
export declare const createConsentModeHelper: () => ConsentModeHelper;
|
|
4
|
+
export declare const consentModeHelper: ConsentModeHelper;
|
|
5
|
+
/** @deprecated compat:factory-refactor — use `consentModeHelper.consentBootstrapScript(…)` */
|
|
6
|
+
export declare const consentBootstrapScript: (opts?: ConsentOptions) => string;
|
|
7
|
+
//# sourceMappingURL=gtobserver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gtobserver.d.ts","sourceRoot":"","sources":["../src/gtobserver.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAmB,cAAc,EAAiB,MAAM,YAAY,CAAA;AAEhF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAE9D,eAAO,MAAM,uBAAuB,QAAO,iBAsK1C,CAAA;AAED,eAAO,MAAM,iBAAiB,mBAA4B,CAAA;AAE1D,8FAA8F;AAC9F,eAAO,MAAM,sBAAsB,UAAW,cAAc,KAAG,MAAwD,CAAA"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { CONSENT_AUTO_MAX_AGE, CONSENT_EVENT, CONSENT_KEY, CONSENT_SETUP_FLAG, CONSENT_SIGNAL_DEFAULTS, DEFAULT_CONSENT_CATEGORIES, } from './consts.js';
|
|
2
|
+
import { AUTO_SKEW } from './consts.local.js';
|
|
3
|
+
import { consentLinkHelper } from './linker.js';
|
|
4
|
+
export const createConsentModeHelper = () => {
|
|
5
|
+
const global = () => typeof window !== 'undefined' ? window : null;
|
|
6
|
+
// A `function`, not an arrow: what goes on the queue is its own `arguments` object.
|
|
7
|
+
function gtagConsent(..._args) {
|
|
8
|
+
const win = global();
|
|
9
|
+
if (win == null) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
win.dataLayer = win.dataLayer ?? [];
|
|
13
|
+
// `arguments`, not `_args`. The rest parameter is only here to type the call sites; what goes on
|
|
14
|
+
// the queue must be the arguments object itself.
|
|
15
|
+
// eslint-disable-next-line prefer-rest-params
|
|
16
|
+
win.dataLayer.push(arguments);
|
|
17
|
+
}
|
|
18
|
+
const categoriesOf = (opts) => opts?.categories ?? DEFAULT_CONSENT_CATEGORIES;
|
|
19
|
+
/**
|
|
20
|
+
* Inline: treat an automatic decision past `CONSENT_AUTO_MAX_AGE` as no decision at all — run
|
|
21
|
+
* `onStale` on the parsed record `r`. The store holds such a record back until the visitor is
|
|
22
|
+
* located again, and the head scripts must not apply what the store will not.
|
|
23
|
+
*/
|
|
24
|
+
const staleAutoScript = (onStale) => `if(r&&typeof r.auto==='number'){var a=Math.floor(Date.now()/1000)-r.auto;` +
|
|
25
|
+
`if(a>${CONSENT_AUTO_MAX_AGE}||a<-${AUTO_SKEW}){${onStale}}}`;
|
|
26
|
+
const consentDefaults = (categories) => {
|
|
27
|
+
const used = new Set((categories ?? DEFAULT_CONSENT_CATEGORIES)
|
|
28
|
+
.flatMap(category => category.signals ?? []));
|
|
29
|
+
return Object.fromEntries(Object.entries(CONSENT_SIGNAL_DEFAULTS)
|
|
30
|
+
.filter(([signal]) => used.has(signal)));
|
|
31
|
+
};
|
|
32
|
+
const consentUpdate = (record, categories) => {
|
|
33
|
+
const update = {};
|
|
34
|
+
for (const category of categories ?? DEFAULT_CONSENT_CATEGORIES) {
|
|
35
|
+
const granted = category.required === true || record[category.key] === true;
|
|
36
|
+
for (const signal of category.signals ?? []) {
|
|
37
|
+
// A signal named by two categories is granted only when every one of them is.
|
|
38
|
+
update[signal] = granted && update[signal] !== 'denied' ? 'granted' : 'denied';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return update;
|
|
42
|
+
};
|
|
43
|
+
const pushConsentDefaults = (opts) => {
|
|
44
|
+
const win = global();
|
|
45
|
+
if (win == null || opts?.silent === true || win[CONSENT_SETUP_FLAG] === true) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
gtagConsent('consent', 'default', consentDefaults(categoriesOf(opts)));
|
|
49
|
+
win[CONSENT_SETUP_FLAG] = true;
|
|
50
|
+
};
|
|
51
|
+
const applyConsent = (record, opts) => {
|
|
52
|
+
const win = global();
|
|
53
|
+
if (win == null || opts?.silent === true) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const categories = categoriesOf(opts);
|
|
57
|
+
for (const category of categories) {
|
|
58
|
+
if (category.globalVar != null) {
|
|
59
|
+
win[category.globalVar] = category.required === true || record[category.key] === true;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
gtagConsent('consent', 'update', consentUpdate(record, categories));
|
|
63
|
+
for (const category of categories) {
|
|
64
|
+
if (category.event != null && (category.required === true || record[category.key] === true)) {
|
|
65
|
+
win.dataLayer = win.dataLayer ?? [];
|
|
66
|
+
win.dataLayer.push({ event: category.event });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// A gate script (`consentGateScript`) that already decided NOT to load, because nothing was
|
|
70
|
+
// granted at the time it ran, has no other way to hear this. Consent Mode itself speaks only on
|
|
71
|
+
// `dataLayer`, which a tag that never loaded is not listening to.
|
|
72
|
+
if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function'
|
|
73
|
+
&& typeof CustomEvent === 'function') {
|
|
74
|
+
window.dispatchEvent(new CustomEvent(CONSENT_EVENT, { detail: { record } }));
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
const trackingGranted = (record, categories = DEFAULT_CONSENT_CATEGORIES) => record != null && categories.some(category => !category.required && (category.signals?.length ?? 0) > 0 && record[category.key] === true);
|
|
78
|
+
const consentBootstrapScript = (opts) => {
|
|
79
|
+
const defaults = JSON.stringify(consentDefaults(categoriesOf(opts)));
|
|
80
|
+
const categories = JSON.stringify(categoriesOf(opts).map(category => ({
|
|
81
|
+
key: category.key,
|
|
82
|
+
required: category.required === true,
|
|
83
|
+
signals: category.signals ?? [],
|
|
84
|
+
globalVar: category.globalVar ?? null,
|
|
85
|
+
})));
|
|
86
|
+
const storageKey = JSON.stringify(opts?.storageKey ?? CONSENT_KEY);
|
|
87
|
+
const flag = JSON.stringify(CONSENT_SETUP_FLAG);
|
|
88
|
+
// Right after the default is pushed and before EITHER storage read below (this one, and the
|
|
89
|
+
// `consentGateScript` that is concatenated after this whole IIFE) — an adopted decision must
|
|
90
|
+
// already be in storage by the time anything reads it, so `gtm.js`'s own `page_view` never sees
|
|
91
|
+
// the parameter and a granted decision loads the tag on arrival. A page with no `opts.linker`
|
|
92
|
+
// gets an empty string here, unchanged from before this existed.
|
|
93
|
+
const linker = opts?.linker != null ? `${consentLinkHelper.consentLinkerScript(opts)};` : '';
|
|
94
|
+
return `(function(w,d){` +
|
|
95
|
+
`w.dataLayer=w.dataLayer||[];function g(){w.dataLayer.push(arguments)}` +
|
|
96
|
+
`if(w[${flag}])return;g('consent','default',${defaults});w[${flag}]=true;` +
|
|
97
|
+
linker +
|
|
98
|
+
`var raw=null;try{raw=w.localStorage.getItem(${storageKey})}catch(e){}` +
|
|
99
|
+
`if(!raw){var p=('; '+d.cookie).split('; '+${storageKey}+'=');` +
|
|
100
|
+
`if(p.length===2){raw=p.pop().split(';').shift()}}` +
|
|
101
|
+
`if(!raw)return;var r;try{r=JSON.parse(raw)}catch(e){return}` +
|
|
102
|
+
staleAutoScript('return') +
|
|
103
|
+
`var cs=${categories},u={};` +
|
|
104
|
+
`for(var i=0;i<cs.length;i++){var c=cs[i];var ok=c.required||r[c.key]===true;` +
|
|
105
|
+
`if(c.globalVar){w[c.globalVar]=ok}` +
|
|
106
|
+
`for(var j=0;j<c.signals.length;j++){var s=c.signals[j];` +
|
|
107
|
+
`u[s]=ok&&u[s]!=='denied'?'granted':'denied'}}` +
|
|
108
|
+
`g('consent','update',u)})(window,document)`;
|
|
109
|
+
};
|
|
110
|
+
const consentGateScript = (loaderExpr, opts) => {
|
|
111
|
+
const gate = JSON.stringify(categoriesOf(opts).map(category => ({
|
|
112
|
+
key: category.key,
|
|
113
|
+
required: category.required === true,
|
|
114
|
+
hasSignal: (category.signals ?? []).length > 0,
|
|
115
|
+
})));
|
|
116
|
+
const storageKey = JSON.stringify(opts?.storageKey ?? CONSENT_KEY);
|
|
117
|
+
const event = JSON.stringify(CONSENT_EVENT);
|
|
118
|
+
return `(function(w,d){` +
|
|
119
|
+
`function ok(r){if(!r)return false;var cs=${gate};` +
|
|
120
|
+
`for(var i=0;i<cs.length;i++){var c=cs[i];` +
|
|
121
|
+
`if(!c.required&&c.hasSignal&&r[c.key]===true)return true}return false}` +
|
|
122
|
+
`function load(){${loaderExpr}}` +
|
|
123
|
+
`var raw=null;try{raw=w.localStorage.getItem(${storageKey})}catch(e){}` +
|
|
124
|
+
`if(!raw){var p=('; '+d.cookie).split('; '+${storageKey}+'=');` +
|
|
125
|
+
`if(p.length===2){raw=p.pop().split(';').shift()}}` +
|
|
126
|
+
`var r=null;if(raw){try{r=JSON.parse(raw)}catch(e){r=null}}` +
|
|
127
|
+
staleAutoScript('r=null') +
|
|
128
|
+
`if(ok(r)){load();return}` +
|
|
129
|
+
`function h(ev){if(ok(ev&&ev.detail&&ev.detail.record)){` +
|
|
130
|
+
`w.removeEventListener(${event},h);load()}}` +
|
|
131
|
+
`w.addEventListener(${event},h)` +
|
|
132
|
+
`})(window,document)`;
|
|
133
|
+
};
|
|
134
|
+
return {
|
|
135
|
+
gtagConsent, consentDefaults, consentUpdate, pushConsentDefaults, applyConsent, trackingGranted,
|
|
136
|
+
consentBootstrapScript, consentGateScript,
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
export const consentModeHelper = createConsentModeHelper();
|
|
140
|
+
/** @deprecated compat:factory-refactor — use `consentModeHelper.consentBootstrapScript(…)` */
|
|
141
|
+
export const consentBootstrapScript = (opts) => consentModeHelper.consentBootstrapScript(opts);
|
|
142
|
+
//# sourceMappingURL=gtobserver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gtobserver.js","sourceRoot":"","sources":["../src/gtobserver.ts"],"names":[],"mappings":"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"}
|
package/build/i18n/be.json
CHANGED
|
@@ -2,9 +2,7 @@
|
|
|
2
2
|
"title": "Налады файлаў cookie",
|
|
3
3
|
"description": "Мы выкарыстоўваем файлы cookie, каб палепшыць ваш досвед прагляду, паказваць персаналізаваную рэкламу ці змесціва і аналізаваць наш трафік. Націскаючы «Прыняць усе», вы пагаджаецеся на выкарыстанне файлаў cookie.",
|
|
4
4
|
"essential": "Неабходныя файлы cookie",
|
|
5
|
-
"essentialDesc": "Патрэбныя для працы сайта — уваход, бяспека і захаванне
|
|
6
|
-
"functional": "Функцыянальныя файлы cookie",
|
|
7
|
-
"functionalDesc": "Запамінаюць вашы налады, напрыклад мову інтэрфейсу, каб вам не даводзілася задаваць іх зноў.",
|
|
5
|
+
"essentialDesc": "Патрэбныя для працы сайта — уваход, бяспека і захаванне вашага выбару адносна файлаў cookie і мовы інтэрфейсу. Іх нельга адключыць.",
|
|
8
6
|
"analytics": "Аналітычныя файлы cookie",
|
|
9
7
|
"analyticsDesc": "Дапамагаюць нам паляпшаць наш вэб-сайт, збіраючы і паведамляючы інфармацыю пра яго выкарыстанне.",
|
|
10
8
|
"marketing": "Маркетынгавыя файлы cookie",
|
|
@@ -34,5 +32,12 @@
|
|
|
34
32
|
"privacy": "Палітыка прыватнасці",
|
|
35
33
|
"terms": "Умовы карыстання",
|
|
36
34
|
"domains": "Гэты выбар распаўсюджваецца на {{domains}}.",
|
|
37
|
-
"policyDomains": "Гэты выбар распаўсюджваецца на наступныя дамены:"
|
|
35
|
+
"policyDomains": "Гэты выбар распаўсюджваецца на наступныя дамены:",
|
|
36
|
+
"barTitle": "Файлы cookie на гэтым сайце",
|
|
37
|
+
"barDescription": "Мы выкарыстоўваем неабходныя файлы cookie для працы сайта — для ўваходу, забеспячэння бяспекі і запамінання вашага выбару. З вашай згоды мы таксама выкарыстоўвалі б наступныя неабавязковыя файлы cookie: {{categories}}. Яны застаюцца выключанымі, пакуль вы іх не дазволіце, а свой выбар вы можаце ў любы момант змяніць або адклікаць у наладах файлаў cookie.",
|
|
38
|
+
"barDescriptionEssential": "Гэты сайт выкарыстоўвае толькі неабходныя файлы cookie — для ўваходу, забеспячэння бяспекі і запамінання вашага выбару. Яны не патрабуюць згоды і не могуць быць адключаны.",
|
|
39
|
+
"acceptMandatory": "Прыняць толькі неабходныя",
|
|
40
|
+
"locating": "Вызначаем ваш рэгіён…",
|
|
41
|
+
"autoReason": "Гэтыя налады ўжыты аўтаматычна, бо там, адкуль вы праглядаеце сайт, згода на файлы cookie не патрабуецца. Вы можаце змяніць іх у любы момант.",
|
|
42
|
+
"policyRegional": "Там, дзе закон месца знаходжання наведвальніка патрабуе папярэдняй згоды, — у ЕС і ЕЭЗ, Вялікабрытаніі, Швейцарыі і іншых краінах з падобнымі правіламі — неабавязковыя файлы cookie застаюцца выключанымі, пакуль наведвальнік іх не дазволіць. У астатніх краінах яны ўключаны па змаўчанні, акрамя выпадкаў, калі браўзер перадае сігнал Global Privacy Control, які ўлічваецца як адмова; іх можна адключыць у любы момант кнопкай ніжэй."
|
|
38
43
|
}
|
package/build/i18n/de.json
CHANGED
|
@@ -2,9 +2,7 @@
|
|
|
2
2
|
"title": "Cookie-Einstellungen",
|
|
3
3
|
"description": "Wir verwenden Cookies, um Ihr Surferlebnis zu verbessern, personalisierte Anzeigen oder Inhalte bereitzustellen und unseren Datenverkehr zu analysieren. Indem Sie auf „Alle akzeptieren\" klicken, stimmen Sie der Verwendung von Cookies zu.",
|
|
4
4
|
"essential": "Notwendige Cookies",
|
|
5
|
-
"essentialDesc": "Erforderlich, damit die Website funktioniert — Anmeldung, Sicherheit und das Speichern
|
|
6
|
-
"functional": "Funktionale Cookies",
|
|
7
|
-
"functionalDesc": "Merken sich Ihre Auswahl, etwa die Oberflächensprache, damit Sie nicht erneut wählen müssen.",
|
|
5
|
+
"essentialDesc": "Erforderlich, damit die Website funktioniert — Anmeldung, Sicherheit und das Speichern Ihrer Cookie-Auswahl und der Oberflächensprache. Sie lassen sich nicht abschalten.",
|
|
8
6
|
"analytics": "Analyse-Cookies",
|
|
9
7
|
"analyticsDesc": "Helfen uns, unsere Website zu verbessern, indem sie Informationen zur Nutzung sammeln und melden.",
|
|
10
8
|
"marketing": "Marketing-Cookies",
|
|
@@ -34,5 +32,12 @@
|
|
|
34
32
|
"privacy": "Datenschutzerklärung",
|
|
35
33
|
"terms": "Nutzungsbedingungen",
|
|
36
34
|
"domains": "Diese Wahl gilt für {{domains}}.",
|
|
37
|
-
"policyDomains": "Diese Wahl gilt für die folgenden Domains:"
|
|
35
|
+
"policyDomains": "Diese Wahl gilt für die folgenden Domains:",
|
|
36
|
+
"barTitle": "Cookies auf dieser Website",
|
|
37
|
+
"barDescription": "Wir verwenden notwendige Cookies, damit diese Website funktioniert – für die Anmeldung, die Sicherheit und um Ihre Auswahl zu speichern. Mit Ihrer Einwilligung würden wir außerdem diese optionalen Cookies verwenden: {{categories}}. Sie bleiben deaktiviert, bis Sie sie erlauben, und Sie können Ihre Auswahl jederzeit in den Cookie-Einstellungen ändern oder widerrufen.",
|
|
38
|
+
"barDescriptionEssential": "Diese Website verwendet nur notwendige Cookies – für die Anmeldung, die Sicherheit und um Ihre Auswahl zu speichern. Sie erfordern keine Einwilligung und können nicht deaktiviert werden.",
|
|
39
|
+
"acceptMandatory": "Nur notwendige akzeptieren",
|
|
40
|
+
"locating": "Ihre Region wird ermittelt …",
|
|
41
|
+
"autoReason": "Diese Einstellungen wurden automatisch angewendet, weil dort, von wo aus Sie die Website aufrufen, keine Cookie-Einwilligung erforderlich ist. Sie können sie jederzeit ändern.",
|
|
42
|
+
"policyRegional": "Wo das Recht am Aufenthaltsort der Besucher eine vorherige Einwilligung verlangt – in der EU und im EWR, im Vereinigten Königreich, in der Schweiz und in weiteren Ländern mit ähnlichen Regeln –, bleiben optionale Cookies deaktiviert, bis sie erlaubt werden. Anderswo sind sie standardmäßig aktiviert, außer wenn der Browser ein Global-Privacy-Control-Signal sendet, das als Ablehnung beachtet wird; sie lassen sich jederzeit über die Schaltfläche unten deaktivieren."
|
|
38
43
|
}
|
package/build/i18n/en.json
CHANGED
|
@@ -2,9 +2,7 @@
|
|
|
2
2
|
"title": "Cookie Preferences",
|
|
3
3
|
"description": "We use cookies to enhance your browsing experience, serve personalized ads or content, and analyze our traffic. By clicking \"Accept All\", you consent to our use of cookies.",
|
|
4
4
|
"essential": "Essential Cookies",
|
|
5
|
-
"essentialDesc": "Required for the site to work — signing in, security and remembering
|
|
6
|
-
"functional": "Functional Cookies",
|
|
7
|
-
"functionalDesc": "Remember your choices, such as the interface language, so you do not have to make them again.",
|
|
5
|
+
"essentialDesc": "Required for the site to work — signing in, security, and remembering your cookie choices and interface language. They cannot be switched off.",
|
|
8
6
|
"analytics": "Analytics Cookies",
|
|
9
7
|
"analyticsDesc": "Help us improve our website by collecting and reporting information on its usage.",
|
|
10
8
|
"marketing": "Marketing Cookies",
|
|
@@ -34,5 +32,12 @@
|
|
|
34
32
|
"privacy": "Privacy Policy",
|
|
35
33
|
"terms": "Terms & Conditions",
|
|
36
34
|
"domains": "This choice applies to {{domains}}.",
|
|
37
|
-
"policyDomains": "This choice applies across these domains:"
|
|
35
|
+
"policyDomains": "This choice applies across these domains:",
|
|
36
|
+
"barTitle": "Cookies on this site",
|
|
37
|
+
"barDescription": "We use essential cookies to make this site work — for signing in, security and remembering your choices. With your consent we would also use these optional cookies: {{categories}}. They stay off until you allow them, and you can change or withdraw your choice at any time in the cookie preferences.",
|
|
38
|
+
"barDescriptionEssential": "This site uses only essential cookies — for signing in, security and remembering your choices. They need no consent and cannot be switched off.",
|
|
39
|
+
"acceptMandatory": "Accept only mandatory",
|
|
40
|
+
"locating": "Checking your region…",
|
|
41
|
+
"autoReason": "These settings were applied automatically, because cookie consent is not required where you are browsing from. You can change them at any time.",
|
|
42
|
+
"policyRegional": "Where the law of the visitor's location requires prior consent — the EU and EEA, the United Kingdom, Switzerland and other countries with similar rules — optional cookies stay off until the visitor allows them. Elsewhere they are switched on by default, except when the browser sends a Global Privacy Control signal, which is honoured as a refusal; they can be switched off at any time with the button below."
|
|
38
43
|
}
|
package/build/i18n/es.json
CHANGED
|
@@ -2,9 +2,7 @@
|
|
|
2
2
|
"title": "Preferencias de cookies",
|
|
3
3
|
"description": "Utilizamos cookies para mejorar tu experiencia de navegación, ofrecer anuncios o contenido personalizados y analizar nuestro tráfico. Al hacer clic en «Aceptar todo», aceptas nuestro uso de cookies.",
|
|
4
4
|
"essential": "Cookies esenciales",
|
|
5
|
-
"essentialDesc": "Necesarias para que el sitio funcione: inicio de sesión, seguridad y recordar
|
|
6
|
-
"functional": "Cookies funcionales",
|
|
7
|
-
"functionalDesc": "Recuerdan tus preferencias, como el idioma de la interfaz, para que no tengas que elegirlas de nuevo.",
|
|
5
|
+
"essentialDesc": "Necesarias para que el sitio funcione: inicio de sesión, seguridad y recordar tus decisiones sobre cookies y el idioma de la interfaz. No se pueden desactivar.",
|
|
8
6
|
"analytics": "Cookies analíticas",
|
|
9
7
|
"analyticsDesc": "Nos ayudan a mejorar nuestro sitio web recopilando e informando sobre su uso.",
|
|
10
8
|
"marketing": "Cookies de marketing",
|
|
@@ -34,5 +32,12 @@
|
|
|
34
32
|
"privacy": "Política de privacidad",
|
|
35
33
|
"terms": "Términos y condiciones",
|
|
36
34
|
"domains": "Esta elección se aplica a {{domains}}.",
|
|
37
|
-
"policyDomains": "Esta elección se aplica a los siguientes dominios:"
|
|
35
|
+
"policyDomains": "Esta elección se aplica a los siguientes dominios:",
|
|
36
|
+
"barTitle": "Cookies en este sitio",
|
|
37
|
+
"barDescription": "Usamos cookies esenciales para que este sitio funcione: para iniciar sesión, por seguridad y para recordar tus elecciones. Con tu consentimiento también usaríamos estas cookies opcionales: {{categories}}. Permanecen desactivadas hasta que las permitas, y puedes cambiar o retirar tu elección en cualquier momento en las preferencias de cookies.",
|
|
38
|
+
"barDescriptionEssential": "Este sitio solo usa cookies esenciales: para iniciar sesión, por seguridad y para recordar tus elecciones. No requieren consentimiento y no se pueden desactivar.",
|
|
39
|
+
"acceptMandatory": "Aceptar solo las esenciales",
|
|
40
|
+
"locating": "Comprobando tu región…",
|
|
41
|
+
"autoReason": "Esta configuración se aplicó automáticamente porque, desde donde navegas, no se requiere consentimiento para las cookies. Puedes cambiarla en cualquier momento.",
|
|
42
|
+
"policyRegional": "Donde la ley del lugar en que se encuentra el visitante exige consentimiento previo —la UE y el EEE, el Reino Unido, Suiza y otros países con normas similares—, las cookies opcionales permanecen desactivadas hasta que el visitante las permita. En el resto están activadas por defecto, salvo cuando el navegador envía una señal Global Privacy Control, que se respeta como rechazo; pueden desactivarse en cualquier momento con el botón de abajo."
|
|
38
43
|
}
|
package/build/i18n/fr.json
CHANGED
|
@@ -2,9 +2,7 @@
|
|
|
2
2
|
"title": "Préférences de cookies",
|
|
3
3
|
"description": "Nous utilisons des cookies pour améliorer votre navigation, proposer des publicités ou contenus personnalisés et analyser notre trafic. En cliquant sur « Tout accepter », vous consentez à leur utilisation.",
|
|
4
4
|
"essential": "Cookies essentiels",
|
|
5
|
-
"essentialDesc": "Nécessaires au fonctionnement du site
|
|
6
|
-
"functional": "Cookies fonctionnels",
|
|
7
|
-
"functionalDesc": "Mémorisent vos choix, comme la langue de l'interface, afin que vous n'ayez pas à les refaire.",
|
|
5
|
+
"essentialDesc": "Nécessaires au fonctionnement du site : connexion, sécurité et mémorisation de vos choix en matière de cookies et de la langue de l'interface. Ils ne peuvent pas être désactivés.",
|
|
8
6
|
"analytics": "Cookies analytiques",
|
|
9
7
|
"analyticsDesc": "Nous aident à améliorer notre site en recueillant et en analysant des informations sur son utilisation.",
|
|
10
8
|
"marketing": "Cookies marketing",
|
|
@@ -34,5 +32,12 @@
|
|
|
34
32
|
"privacy": "Politique de confidentialité",
|
|
35
33
|
"terms": "Conditions générales",
|
|
36
34
|
"domains": "Ce choix s'applique à {{domains}}.",
|
|
37
|
-
"policyDomains": "Ce choix s'applique aux domaines suivants :"
|
|
35
|
+
"policyDomains": "Ce choix s'applique aux domaines suivants :",
|
|
36
|
+
"barTitle": "Cookies sur ce site",
|
|
37
|
+
"barDescription": "Nous utilisons des cookies essentiels au fonctionnement de ce site : pour la connexion, la sécurité et la mémorisation de vos choix. Avec votre consentement, nous utiliserions également ces cookies facultatifs : {{categories}}. Ils restent désactivés tant que vous ne les autorisez pas, et vous pouvez modifier ou retirer votre choix à tout moment dans les préférences de cookies.",
|
|
38
|
+
"barDescriptionEssential": "Ce site n'utilise que des cookies essentiels : pour la connexion, la sécurité et la mémorisation de vos choix. Ils ne nécessitent pas de consentement et ne peuvent pas être désactivés.",
|
|
39
|
+
"acceptMandatory": "Accepter uniquement les essentiels",
|
|
40
|
+
"locating": "Vérification de votre région…",
|
|
41
|
+
"autoReason": "Ces paramètres ont été appliqués automatiquement, car le consentement aux cookies n'est pas requis là où vous naviguez. Vous pouvez les modifier à tout moment.",
|
|
42
|
+
"policyRegional": "Là où la loi du lieu où se trouve le visiteur exige un consentement préalable — l'UE et l'EEE, le Royaume-Uni, la Suisse et d'autres pays aux règles similaires —, les cookies facultatifs restent désactivés tant que le visiteur ne les autorise pas. Ailleurs, ils sont activés par défaut, sauf lorsque le navigateur envoie un signal Global Privacy Control, respecté comme un refus ; ils peuvent être désactivés à tout moment avec le bouton ci-dessous."
|
|
38
43
|
}
|
package/build/i18n/pl.json
CHANGED
|
@@ -2,9 +2,7 @@
|
|
|
2
2
|
"title": "Preferencje dotyczące plików cookie",
|
|
3
3
|
"description": "Używamy plików cookie w celu ulepszenia Twojego doświadczenia podczas przeglądania, wyświetlania spersonalizowanych reklam lub treści oraz analizowania naszego ruchu. Klikając „Akceptuj wszystkie\", wyrażasz zgodę na używanie przez nas plików cookie.",
|
|
4
4
|
"essential": "Niezbędne pliki cookie",
|
|
5
|
-
"essentialDesc": "Wymagane do działania witryny — logowanie, bezpieczeństwo
|
|
6
|
-
"functional": "Funkcjonalne pliki cookie",
|
|
7
|
-
"functionalDesc": "Zapamiętują Twoje wybory, np. język interfejsu, aby nie trzeba było wybierać od nowa.",
|
|
5
|
+
"essentialDesc": "Wymagane do działania witryny — logowanie, bezpieczeństwo oraz zapamiętanie Twoich wyborów dotyczących plików cookie i języka interfejsu. Nie można ich wyłączyć.",
|
|
8
6
|
"analytics": "Analityczne pliki cookie",
|
|
9
7
|
"analyticsDesc": "Pomagają nam ulepszać naszą witrynę internetową, zbierając i raportując informacje o jej użytkowaniu.",
|
|
10
8
|
"marketing": "Marketingowe pliki cookie",
|
|
@@ -34,5 +32,12 @@
|
|
|
34
32
|
"privacy": "Polityka prywatności",
|
|
35
33
|
"terms": "Regulamin",
|
|
36
34
|
"domains": "Ten wybór dotyczy: {{domains}}.",
|
|
37
|
-
"policyDomains": "Ten wybór dotyczy następujących domen:"
|
|
35
|
+
"policyDomains": "Ten wybór dotyczy następujących domen:",
|
|
36
|
+
"barTitle": "Pliki cookie w tym serwisie",
|
|
37
|
+
"barDescription": "Używamy niezbędnych plików cookie, aby serwis działał — do logowania, zapewnienia bezpieczeństwa i zapamiętania Twoich wyborów. Za Twoją zgodą użylibyśmy również tych opcjonalnych plików cookie: {{categories}}. Pozostają wyłączone, dopóki na nie nie zezwolisz, a swój wybór możesz w każdej chwili zmienić lub wycofać w preferencjach plików cookie.",
|
|
38
|
+
"barDescriptionEssential": "Ten serwis używa wyłącznie niezbędnych plików cookie — do logowania, zapewnienia bezpieczeństwa i zapamiętania Twoich wyborów. Nie wymagają one zgody i nie można ich wyłączyć.",
|
|
39
|
+
"acceptMandatory": "Akceptuj tylko niezbędne",
|
|
40
|
+
"locating": "Sprawdzamy Twój region…",
|
|
41
|
+
"autoReason": "Te ustawienia zastosowano automatycznie, ponieważ tam, skąd przeglądasz serwis, zgoda na pliki cookie nie jest wymagana. Możesz je zmienić w każdej chwili.",
|
|
42
|
+
"policyRegional": "Tam, gdzie prawo miejsca pobytu odwiedzającego wymaga uprzedniej zgody — w UE i EOG, w Wielkiej Brytanii, Szwajcarii i innych krajach o podobnych przepisach — opcjonalne pliki cookie pozostają wyłączone, dopóki odwiedzający na nie nie zezwoli. W pozostałych krajach są domyślnie włączone, chyba że przeglądarka wysyła sygnał Global Privacy Control, który traktujemy jako odmowę; w każdej chwili można je wyłączyć przyciskiem poniżej."
|
|
38
43
|
}
|