@consenti/api 0.2.0 → 0.4.0

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.
Files changed (79) hide show
  1. package/README.md +578 -143
  2. package/dist/chunk-COR72NFQ.js +2 -0
  3. package/dist/chunk-COR72NFQ.js.map +1 -0
  4. package/dist/chunk-S2IEYESR.js +2 -0
  5. package/dist/chunk-S2IEYESR.js.map +1 -0
  6. package/dist/dashboard/assets/ApiConfig-CZMtYRfK.js +1 -0
  7. package/dist/dashboard/assets/ArchivedProfileList-BlQ2gEWz.js +1 -0
  8. package/dist/dashboard/assets/AuditLog-BpZoAFOe.js +1 -0
  9. package/dist/dashboard/assets/ChangePassword-BZkP2dXQ.js +1 -0
  10. package/dist/dashboard/assets/ConfirmDialog-BDlnfTdx.js +1 -0
  11. package/dist/dashboard/assets/ConsentList-DgJMrhih.js +1 -0
  12. package/dist/dashboard/assets/ConsentTemplateEditor-DA7B5aI_.js +1 -0
  13. package/dist/dashboard/assets/ConsentTemplateList-DMPd2y5s.js +1 -0
  14. package/dist/dashboard/assets/HeadingTagInput-D2S9xDMJ.js +1 -0
  15. package/dist/dashboard/assets/HowItWorks-CJCrdr3o.js +1 -0
  16. package/dist/dashboard/assets/PermissionGate-C69dhwV1.js +1 -0
  17. package/dist/dashboard/assets/PreviewPane-D7mDeBT8.js +38 -0
  18. package/dist/dashboard/assets/ProfileEditor-CSFdOweN.js +2 -0
  19. package/dist/dashboard/assets/ProfileList-C4cIDrM6.js +1 -0
  20. package/dist/dashboard/assets/ProfileVersionHistory-CX5-Oupy.js +3 -0
  21. package/dist/dashboard/assets/RecordDetailModal-DIpGxfqA.js +1 -0
  22. package/dist/dashboard/assets/Reports-B1Ww0ovT.js +1 -0
  23. package/dist/dashboard/assets/RoleList-CQ1GjR0W.js +1 -0
  24. package/dist/dashboard/assets/Select-C_JusbT5.js +1 -0
  25. package/dist/dashboard/assets/Settings-sIMVWQ0V.js +1 -0
  26. package/dist/dashboard/assets/SetupWizard-ChFBxqo3.js +1 -0
  27. package/dist/dashboard/assets/Table-BUxoz0YR.js +1 -0
  28. package/dist/dashboard/assets/TenantList-DCsT7ghb.js +1 -0
  29. package/dist/dashboard/assets/UITemplateEditor-BAaMnuOU.js +2 -0
  30. package/dist/dashboard/assets/UITemplateList-C3UMbnfs.js +1 -0
  31. package/dist/dashboard/assets/UserList-CHGNnS50.js +1 -0
  32. package/dist/dashboard/assets/VendorList-C-sswM1A.js +1 -0
  33. package/dist/dashboard/assets/VisitorList-DNB9Ia72.js +1 -0
  34. package/dist/dashboard/assets/check-D0g4XvmN.js +1 -0
  35. package/dist/dashboard/assets/client-CYntrO2g.js +1 -0
  36. package/dist/dashboard/assets/copy-DEi_W2TM.js +1 -0
  37. package/dist/dashboard/assets/createLucideIcon-DAiYBrnd.js +1 -0
  38. package/dist/dashboard/assets/de-jwngydrC.js +25 -0
  39. package/dist/dashboard/assets/debounce-DlvAAT2V.js +1 -0
  40. package/dist/dashboard/assets/dist-GoiMJCTt.js +1 -0
  41. package/dist/dashboard/assets/es-B6Jp0OPe.js +25 -0
  42. package/dist/dashboard/assets/external-link-CFZxxe3W.js +1 -0
  43. package/dist/dashboard/assets/fr-CshYcQPW.js +25 -0
  44. package/dist/dashboard/assets/index-Cr5M1Qy_.css +2 -0
  45. package/dist/dashboard/assets/index-Tr_BcjkN.js +26 -0
  46. package/dist/dashboard/assets/ja-CgjZNBrc.js +25 -0
  47. package/dist/dashboard/assets/profiles-C_SuoLJD.js +1 -0
  48. package/dist/dashboard/assets/roles-D7L936FV.js +1 -0
  49. package/dist/dashboard/assets/rotate-ccw-clock-6y2NDrJ7.js +1 -0
  50. package/dist/dashboard/assets/search-DKwfLBOv.js +1 -0
  51. package/dist/dashboard/assets/templates-CIyMjskA.js +1 -0
  52. package/dist/dashboard/assets/templates-DY68xNys.js +1 -0
  53. package/dist/dashboard/assets/trash-2-eX9s6x8V.js +1 -0
  54. package/dist/dashboard/assets/trash-O30ycMcz.js +1 -0
  55. package/dist/dashboard/assets/useHashQuery-BDjUPXDR.js +1 -0
  56. package/dist/dashboard/assets/users-BRrNOK0W.js +1 -0
  57. package/dist/dashboard/assets/x-BhZiH8AL.js +1 -0
  58. package/dist/dashboard/assets/zh-CN-BnLZkfBC.js +25 -0
  59. package/dist/dashboard/index.html +4 -2
  60. package/dist/dist-QJYW5KUK.js +2 -0
  61. package/dist/dist-QJYW5KUK.js.map +1 -0
  62. package/dist/index.cjs +90 -101
  63. package/dist/index.cjs.map +1 -1
  64. package/dist/index.d.cts +847 -150
  65. package/dist/index.d.ts +847 -150
  66. package/dist/index.js +90 -101
  67. package/dist/index.js.map +1 -1
  68. package/dist/profiles-FCX454HS.js +2 -0
  69. package/dist/profiles-FCX454HS.js.map +1 -0
  70. package/dist/widget/widget.css +1 -1
  71. package/dist/widget/widget.js +1 -1
  72. package/package.json +32 -17
  73. package/dist/dashboard/assets/de-DwE2aQfW.js +0 -5
  74. package/dist/dashboard/assets/es-Dq88TWkB.js +0 -5
  75. package/dist/dashboard/assets/fr-o_Pyg8eR.js +0 -5
  76. package/dist/dashboard/assets/index-BSsYDdb9.js +0 -40
  77. package/dist/dashboard/assets/index-bOTGevzl.css +0 -2
  78. package/dist/dashboard/assets/ja-CwgXYmpD.js +0 -5
  79. package/dist/dashboard/assets/zh-CN-ety9KoQ0.js +0 -5
package/package.json CHANGED
@@ -1,8 +1,12 @@
1
1
  {
2
2
  "name": "@consenti/api",
3
- "version": "0.2.0",
4
- "description": "Zero-dependency GDPR-compliant Consent Management Platform backend",
3
+ "version": "0.4.0",
4
+ "description": "GDPR-style consent management platform backend — no required runtime dependencies, optional peer deps for extra storage drivers and spec-correct IAB TCF encoding",
5
5
  "license": "Apache-2.0",
6
+ "author": {
7
+ "name": "Santosh Ojha",
8
+ "url": "https://santosh.top"
9
+ },
6
10
  "keywords": [
7
11
  "gdpr",
8
12
  "consent-management",
@@ -38,45 +42,56 @@
38
42
  ],
39
43
  "scripts": {
40
44
  "buildonly": "tsup",
41
- "watch": "tsup --watch",
45
+ "watch": "tsup --watch && dev:dashboard",
42
46
  "build:api": "tsup && node scripts/fix-node-prefix.mjs && node scripts/copy-widget.mjs",
43
47
  "build:dashboard": "cd src/dashboard && vite build --config vite.config.ts",
44
48
  "build": "npm run build:api && npm run build:dashboard",
45
49
  "dev:server": "tsx --watch scripts/dev-server.ts",
46
50
  "dev:dashboard": "vite --config src/dashboard/vite.config.ts",
47
51
  "dev": "npm run dev:dashboard & npm run dev:server",
48
- "typecheck": "tsc --noEmit"
52
+ "typecheck": "tsc --noEmit",
53
+ "test": "tsx --test src/__tests__/*.integration.ts"
49
54
  },
50
55
  "devDependencies": {
51
56
  "@consenti/types": "*",
52
57
  "@consenti/utils": "*",
53
- "@preact/preset-vite": "^2.8.1",
54
- "lucide-react": "^1.23.0",
55
- "@tailwindcss/vite": "^4.3.2",
58
+ "@iabgpp/cmpapi": "^3.1.9",
59
+ "@iabtechlabtcf/core": "^1.5.21",
60
+ "@preact/preset-vite": "^2.10.6",
61
+ "@tailwindcss/vite": "^4.3.3",
56
62
  "@types/better-sqlite3": "^7.6.13",
57
- "@types/node": "^26.1.0",
63
+ "@types/node": "^26.1.1",
58
64
  "@types/pg": "^8.11.0",
59
- "autoprefixer": "^10.4.21",
60
- "mongodb": "^7.4.0",
61
- "mysql2": "^3.0.0",
62
- "node-sqlite3-wasm": "^0.8.59",
65
+ "autoprefixer": "^10.5.4",
66
+ "lucide-react": "^1.28.0",
67
+ "mongodb": "^7.5.0",
68
+ "mysql2": "^3.23.1",
69
+ "node-sqlite3-wasm": "^0.8.60",
63
70
  "pg": "^8.0.0",
64
- "postcss": "^8.5.16",
65
- "preact": "^10.29.4",
66
- "tailwindcss": "^4.3.1",
71
+ "postcss": "^8.5.25",
72
+ "preact": "^10.29.7",
73
+ "tailwindcss": "^4.3.3",
67
74
  "tsup": "^8.5.0",
68
75
  "typescript": "^6.0.3",
69
- "vite": "^8.1.3"
76
+ "vite": "^8.2.0"
70
77
  },
71
78
  "peerDependencies": {
79
+ "@iabgpp/cmpapi": ">=3.0.0",
80
+ "@iabtechlabtcf/core": ">=1.5.0",
72
81
  "better-sqlite3": "^12.11.1",
73
82
  "geoip-lite": ">=1.4.0",
74
83
  "mongodb": ">=6.0.0",
75
84
  "mysql2": ">=3.0.0",
76
- "node-sqlite3-wasm": "^0.8.59",
85
+ "node-sqlite3-wasm": "^0.8.60",
77
86
  "pg": ">=8.0.0"
78
87
  },
79
88
  "peerDependenciesMeta": {
89
+ "@iabgpp/cmpapi": {
90
+ "optional": true
91
+ },
92
+ "@iabtechlabtcf/core": {
93
+ "optional": true
94
+ },
80
95
  "node-sqlite3-wasm": {
81
96
  "optional": true
82
97
  },
@@ -1,5 +0,0 @@
1
- var e={_section_nav:`── Navigation ──────────────────────────────────────────`,"nav.dashboard":`Dashboard`,"nav.consentBanners":`Einwilligungsbanner`,"nav.cookieTemplates":`Cookie-Vorlagen`,"nav.uiTemplates":`UI-Vorlagen`,"nav.profiles":`Profile`,"nav.consents":`Einwilligungen`,"nav.visitors":`Besucher`,"nav.users":`Benutzer`,"nav.roles":`Rollen`,"nav.sites":`Websites`,"nav.vendors":`TCF-Anbieter`,"nav.audit":`Audit-Protokoll`,"nav.api":`API`,"nav.apiConfig":`Konfiguration`,"nav.apiDocs":`Endpunkt-Dokumentation`,"nav.settings":`Einstellungen`,"nav.adminDashboard":`Admin-Dashboard`,_section_layout:`── Layout ───────────────────────────────────────────`,"layout.expandSidebar":`Seitenleiste erweitern`,"layout.collapseSidebar":`Seitenleiste einklappen`,"layout.signOut":`Abmelden`,"layout.toggleDark":`In den Dunkelmodus wechseln`,"layout.toggleLight":`In den Hellmodus wechseln`,"layout.poweredBy":`Bereitgestellt von`,_section_common:`── Allgemein ───────────────────────────────────────`,"common.loading":`Wird geladen…`,"common.save":`Speichern`,"common.saving":`Wird gespeichert…`,"common.cancel":`Abbrechen`,"common.close":`Schließen`,"common.delete":`Löschen`,"common.edit":`Bearbeiten`,"common.create":`Erstellen`,"common.confirm":`Bestätigen`,"common.noData":`Keine Daten`,"common.exportCsv":`CSV exportieren`,"common.duplicate":`Duplizieren`,"common.active":`Aktiv`,"common.inactive":`Inaktiv`,"common.name":`Name`,"common.email":`E-Mail`,"common.status":`Status`,"common.created":`Erstellt`,"common.id":`ID`,"common.add":`Hinzufügen`,"common.remove":`Entfernen`,"common.revoke":`Widerrufen`,"common.required":`Erforderlich`,"common.version":`Version`,"common.locale":`Gebietsschema`,"common.country":`Land`,"common.source":`Quelle`,"common.grantAll":`Allen zustimmen`,"common.revokeAll":`Alle widerrufen`,"common.granted":`erteilt`,"common.page":`Seite {{n}}`,"common.prev":`Zurück`,"common.next":`Weiter`,"common.you":`Sie`,"common.default":`Standard`,"common.hide":`Ausblenden`,"common.show":`Anzeigen`,"common.activate":`Aktivieren`,"common.deactivate":`Deaktivieren`,"common.newRole":`Neue Rolle`,"common.copyToClipboard":`In die Zwischenablage kopieren`,"common.back":`Zurück`,"common.copyId":`ID kopieren`,"common.mandatory":`verpflichtend`,"common.optional":`Optional`,"common.roles":`Rollen`,"common.showPassword":`Passwort anzeigen`,"common.hidePassword":`Passwort ausblenden`,"common.updated":`Aktualisiert`,_section_locale:`── Sprachumschalter ────────────────────────────────`,"locale.en":`Englisch`,"locale.switcherAria":`Sprache wechseln`,_section_login:`── Anmeldung ───────────────────────────────────────`,"login.title":`{{appName}} Admin`,"login.subtitle":`Melden Sie sich bei Ihrem Konto an`,"login.email":`E-Mail`,"login.emailPlaceholder":`admin@example.com`,"login.password":`Passwort`,"login.submit":`Anmelden`,"login.submitting":`Anmeldung läuft…`,"login.error.invalid":`Ungültige E-Mail oder ungültiges Passwort`,"login.devSignIn":`⚡ Dev: als user@consenti.dev anmelden`,_section_dashboard:`── Dashboard ────────────────────────────────────`,"dashboard.title":`Dashboard`,"dashboard.stats.totalConsents":`Gesamte Einwilligungen`,"dashboard.stats.totalVisitors":`Gesamte Besucher`,"dashboard.stats.accepted":`Akzeptiert`,"dashboard.stats.acceptedSub":`≥80 % Cookies genehmigt`,"dashboard.stats.rejected":`Abgelehnt`,"dashboard.stats.rejectedSub":`≤20 % Cookies genehmigt`,"dashboard.chart.timeline":`Einwilligungen (letzte 30 Tage)`,"dashboard.chart.timelineAria":`Diagramm zum Verlauf der Einwilligungen`,"dashboard.chart.countries":`Top-Länder`,"dashboard.chart.noData":`Keine Daten.`,"dashboard.chart.noCountryData":`Keine Länderdaten.`,"dashboard.gpc.label":`GPC-Erkennungsrate`,"dashboard.gpc.sub":`{{detected}} von {{total}} Einwilligungen`,_section_consents:`── Einwilligungen ────────────────────────────────`,"consents.title":`Einwilligungsdatensätze`,"consents.filterFrom":`Von`,"consents.filterTo":`Bis`,"consents.filterGpc":`Nur GPC`,"consents.records":`{{n}} Datensätze`,"consents.empty":`Noch keine Einwilligungsdatensätze.`,"consents.col.visitorId":`Besucher-ID`,"consents.col.profile":`Profil`,"consents.col.locale":`Gebietsschema`,"consents.col.gpc":`GPC`,"consents.col.age":`Alter`,"consents.col.source":`Quelle`,"consents.col.created":`Erstellt`,"consents.gpcYes":`Ja`,"consents.ageVerified":`Verifiziert`,_section_visitors:`── Besucher ──────────────────────────────────────`,"visitors.title":`Besucher`,"visitors.empty":`Noch keine Besucher erfasst.`,"visitors.col.visitorId":`Besucher-ID`,"visitors.col.country":`Land`,"visitors.col.firstSeen":`Erstmals gesehen`,"visitors.col.lastSeen":`Zuletzt gesehen`,_section_users:`── Benutzer ───────────────────────────────────────`,"users.title":`Benutzer`,"users.count":`{{n}} Benutzer`,"users.newUser":`+ Neuer Benutzer`,"users.createForm.title":`Benutzer erstellen`,"users.createForm.namePlaceholder":`Name`,"users.createForm.emailPlaceholder":`E-Mail`,"users.createForm.passwordPlaceholder":`Passwort`,"users.createForm.confirmPasswordPlaceholder":`Passwort bestätigen`,"users.createForm.selectRole":`Rolle auswählen…`,"users.createForm.passwordMismatch":`Passwörter stimmen nicht überein`,"users.createForm.error":`Benutzer konnte nicht erstellt werden`,"users.col.status":`Status`,"users.status.active":`Aktiv`,"users.status.inactive":`Inaktiv`,"users.action.activate":`Aktivieren`,"users.action.deactivate":`Deaktivieren`,"users.dialog.delete.title":`Benutzer „{{name}}“ löschen?`,"users.dialog.delete.message":`Dieses Benutzerkonto wird dauerhaft entfernt.`,_section_roles:`── Rollen & Berechtigungen ───────────────────────`,"roles.title":`Rollen & Berechtigungen`,"roles.list.heading":`Rollen`,"roles.list.empty":`Noch keine Rollen. Erstellen Sie eine, um zu beginnen.`,"roles.form.roleNameLabel":`Rollenname`,"roles.form.roleNamePlaceholder":`z. B. Editor`,"roles.form.descriptionLabel":`Beschreibung`,"roles.form.descriptionPlaceholder":`Optionale Beschreibung`,"roles.perms.heading":`Berechtigungen — {{name}}`,"roles.perms.selectPrompt":`Wählen Sie eine Rolle aus, um Berechtigungen zu verwalten`,"roles.perms.clickPrompt":`Klicken Sie links auf eine Rolle, um deren Berechtigungen anzuzeigen und zu verwalten.`,"roles.perms.noPerms":`Im System sind keine Berechtigungen definiert.`,"roles.error.load":`Rollen konnten nicht geladen werden.`,"roles.error.create":`Rolle konnte nicht erstellt werden.`,"roles.error.update":`Rolle konnte nicht aktualisiert werden.`,"roles.error.delete":`Rolle konnte nicht gelöscht werden.`,"roles.error.perm":`Berechtigung konnte nicht aktualisiert werden.`,"roles.dialog.delete.title":`Rolle „{{name}}“ löschen?`,"roles.dialog.delete.message":`Benutzer mit dieser Rolle verlieren ihre Berechtigungen sofort.`,"roles.aria.editRole":`Rolle bearbeiten`,"roles.aria.deleteRole":`Rolle löschen`,_section_profiles:`── Profile ───────────────────────────────────────`,"profiles.title":`Profile`,"profiles.count":`{{n}} Profile`,"profiles.countSingular":`{{n}} Profil`,"profiles.newProfile":`+ Neues Profil`,"profiles.empty":`Noch keine Profile. Erstellen Sie eines, um zu beginnen.`,"profiles.col.name":`Name`,"profiles.col.defaultLocale":`Standard-Gebietsschema`,"profiles.col.version":`Version`,"profiles.col.templates":`Vorlagen`,"profiles.col.created":`Erstellt`,"profiles.template.cookie":`Cookie:`,"profiles.template.ui":`UI:`,"profiles.action.copyId":`Profil-ID kopieren`,"profiles.action.copying":`Wird kopiert…`,"profiles.dialog.delete.title":`„{{name}}“ löschen?`,"profiles.dialog.delete.message":`Dieses Profil und alle lokalisierten Inhalte werden dauerhaft entfernt.`,"profiles.dialog.copy.title":`„{{name}}“ kopieren?`,"profiles.dialog.copy.message":`Dieses Profil und alle lokalisierten Inhalte werden dupliziert.`,_section_profileEditor:`── Profil-Editor ───────────────────────────────`,"profileEditor.title.new":`Neues Profil`,"profileEditor.title.edit":`Profil bearbeiten`,"profileEditor.title.loading":`Profil-Editor`,"profileEditor.step.config":`Profilkonfiguration`,"profileEditor.step.templates":`Vorlagen`,"profileEditor.step.content":`Inhalt`,"profileEditor.step.mainBanner":`Hauptbanner`,"profileEditor.step.gpcBanner":`GPC-Banner`,"profileEditor.step.prefModal":`Einstellungs-Modal`,"profileEditor.config.profileName":`Profilname`,"profileEditor.config.profileNamePlaceholder":`Meine Website`,"profileEditor.config.defaultLocale":`Standard-Gebietsschema`,"profileEditor.config.allowedDomains":`Erlaubte Domains`,"profileEditor.config.allowedDomainsHint":`Unterstützt Wildcards (*.example.com). Leer lassen, um alle zuzulassen.`,"profileEditor.config.regulations":`Compliance-Vorschriften`,"profileEditor.config.reg.gdprLabel":`DSGVO`,"profileEditor.config.reg.gdprDesc":`EU/EWR Opt-in. Kein Tracking, bis eine Einwilligung erteilt wurde. Banner wird beim ersten Besuch angezeigt.`,"profileEditor.config.reg.ccpaLabel":`CCPA`,"profileEditor.config.reg.ccpaDesc":`Kalifornisches Opt-out. Cookies sind standardmäßig genehmigt. Einen „Do Not Sell“-Auslöser bereitstellen.`,"profileEditor.config.reg.cpraLabel":`CPRA`,"profileEditor.config.reg.cpraDesc":`Kalifornien 2023. Opt-out für Verkauf/Weitergabe; Opt-in für sensible Daten. GPC wird beachtet.`,"profileEditor.config.reg.dpdpaLabel":`DPDPA`,"profileEditor.config.reg.dpdpaDesc":`Indien 2023. Opt-in wie bei der DSGVO. GPC wird nicht anerkannt. Hinweis des Datenverantwortlichen erforderlich.`,"profileEditor.config.darkMode":`Dunkelmodus aktivieren`,"profileEditor.config.darkModeHint":`Wendet dunkle Farbtokens auf das Einwilligungs-Widget für Websites mit dunklem Design an.`,"profileEditor.config.dpdpa.heading":`DPDPA — Erforderliche Felder des Einwilligungshinweises`,"profileEditor.config.dpdpa.fiduciary":`Name des Datenverantwortlichen`,"profileEditor.config.dpdpa.fiduciaryPlaceholder":`Acme Corp Pvt Ltd`,"profileEditor.config.dpdpa.grievanceEmail":`E-Mail des Beschwerdebeauftragten`,"profileEditor.config.dpdpa.grievanceEmailPlaceholder":`grievance@acme.com`,"profileEditor.config.dpdpa.purpose":`Beschreibung des Zwecks`,"profileEditor.config.dpdpa.purposePlaceholder":`Wir erfassen Ihre Daten, um Ihr Erlebnis zu personalisieren…`,"profileEditor.templates.cookieTemplate":`Cookie-Vorlage`,"profileEditor.templates.cookieTemplateHint":`Legt fest, welche Cookies/Zwecke im Präferenzdialog erscheinen. Alle Felder werden aus der Vorlage abgeleitet — im Profil schreibgeschützt.`,"profileEditor.templates.selectCookie":`— Cookie-Vorlage auswählen —`,"profileEditor.templates.uiTemplate":`UI-Vorlage`,"profileEditor.templates.uiTemplateHint":`Legt Layout von Banner/Modal, Anzahl der Schaltflächen und Kategoriestruktur fest. Textinhalte fügen Sie in Schritten 3–5 hinzu.`,"profileEditor.templates.selectUi":`— UI-Vorlage auswählen —`,"profileEditor.templates.noTemplate":`Keine Vorlage ausgewählt.`,"profileEditor.templates.previewPrompt":`Wählen Sie sowohl eine Cookie-Vorlage als auch eine UI-Vorlage aus, um eine Live-Vorschau zu sehen.`,"profileEditor.templates.categoriesCount":`Kategorien`,"profileEditor.templates.buttonsTotal":`Schaltflächen insgesamt`,"profileEditor.content.loadDefaults":`Standardwerte laden`,"profileEditor.content.loadDefaultsTitle":`Diesen Abschnitt mit compliance-konformen Standardtexten (Englisch) füllen`,"profileEditor.content.loadDefaultsNotice":`Standardwerte sind nur auf Englisch verfügbar — übersetzen Sie über die Registerkarte oben.`,"profileEditor.content.importError":`Die hochgeladene Datei konnte nicht verarbeitet werden. Stellen Sie sicher, dass sie dem Consenti-Gebietsschema-Vorlagenformat entspricht.`,"profileEditor.content.mainBanner":`Hauptbanner`,"profileEditor.content.gpcBanner":`GPC-Banner`,"profileEditor.content.prefModal":`Präferenzdialog`,"profileEditor.content.heading":`Überschrift`,"profileEditor.content.subheading":`Unterüberschrift`,"profileEditor.content.bodyText":`Text`,"profileEditor.content.introText":`Einleitungstext (optional)`,"profileEditor.content.buttonLabels":`Schaltflächenbeschriftungen`,"profileEditor.content.categoryHeading":`Kategorieüberschrift`,"profileEditor.content.categoryDesc":`Kategoriebeschreibung`,"profileEditor.content.categoryFallback":`Kategorie {{n}}`,"profileEditor.content.categoryDescPlaceholder":`Beschreibung dieser Cookie-Kategorie…`,"profileEditor.content.mainBannerHeadingPlaceholder":`Ihre Privatsphäre ist uns wichtig`,"profileEditor.content.mainBannerBodyPlaceholder":`Wir verwenden Cookies, um Ihr Erlebnis zu verbessern…`,"profileEditor.content.gpcHeadingPlaceholder":`Global Privacy Control erkannt`,"profileEditor.content.prefHeadingPlaceholder":`Datenschutzeinstellungen`,"profileEditor.content.prefSubheadingPlaceholder":`Verwalten Sie unten Ihre Cookie-Einstellungen.`,"profileEditor.content.prefIntroPlaceholder":`Optionale Einleitung über den Kategorien…`,"profileEditor.content.noContent":`Wählen Sie in Schritt 2 eine UI-Vorlage aus, um mit der Bearbeitung des Inhalts zu beginnen.`,"profileEditor.content.loadingTemplate":`Vorlage wird geladen…`,"profileEditor.nav.nextTemplates":`Weiter: Vorlagen`,"profileEditor.nav.nextContent":`Weiter: Inhalt`,"profileEditor.nav.nextMainBanner":`Weiter: Hauptbanner`,"profileEditor.nav.nextGpcBanner":`Weiter: GPC-Banner`,"profileEditor.nav.nextPrefModal":`Weiter: Einstellungs-Modal`,"profileEditor.action.create":`Profil erstellen`,"profileEditor.action.save":`Profil speichern`,"profileEditor.error.nameRequired":`Profilname ist erforderlich.`,"profileEditor.error.nameRequiredContinue":`Vor dem Fortfahren ist ein Profilname erforderlich.`,"profileEditor.error.cookieRequired":`Wählen Sie eine Cookie-Vorlage aus.`,"profileEditor.error.cookieContinue":`Wählen Sie eine Cookie-Vorlage aus, um fortzufahren.`,"profileEditor.error.uiRequired":`Wählen Sie eine UI-Vorlage aus.`,"profileEditor.error.uiContinue":`Wählen Sie eine UI-Vorlage aus, um fortzufahren.`,"profileEditor.error.failed":`Profil konnte nicht gespeichert werden.`,"profileEditor.error.load":`Profil konnte nicht geladen werden.`,"profileEditor.table.noNoCookies":`In dieser Vorlage sind keine Cookies definiert.`,"profileEditor.table.id":`ID`,"profileEditor.table.legalBasis":`Rechtsgrundlage`,"profileEditor.table.mandatory":`Verpflichtend`,"profileEditor.table.gpc":`GPC`,"profileEditor.table.expiry":`Ablauf`,"profileEditor.table.tcfVendor":`TCF-Anbieter`,"profileEditor.table.cpraCategory":`CPRA-Kategorie`,"profileEditor.export.json":`JSON`,"profileEditor.export.csv":`CSV`,"profileEditor.export.import":`Importieren`,"profileEditor.export.jsonTitle":`Lokalisierte Inhalte als JSON herunterladen`,"profileEditor.export.csvTitle":`Lokalisierte Inhalte als CSV zur Übersetzung herunterladen`,"profileEditor.export.importTitle":`Übersetztes JSON oder CSV hochladen`,"profileEditor.newLink":`+ Neu ↗`,_section_cookieTemplates:`── Cookie-Vorlagen ─────────────────────────────`,"cookieTemplates.title":`Cookie-Vorlagen`,"cookieTemplates.count":`{{n}} Vorlagen`,"cookieTemplates.countSingular":`{{n}} Vorlage`,"cookieTemplates.new":`+ Neue Cookie-Vorlage`,"cookieTemplates.empty.title":`Noch keine Cookie-Vorlagen.`,"cookieTemplates.empty.hint":`Cookie-Vorlagen definieren die Liste der Cookies/Zwecke für Ihre Einwilligungsprofile. Erstellen Sie eine Vorlage, um sie in mehreren Profilen wiederzuverwenden.`,"cookieTemplates.required":`erforderlich`,"cookieTemplates.dialog.delete.title":`„{{name}}“ löschen?`,"cookieTemplates.dialog.delete.message":`Diese Cookie-Vorlage wird dauerhaft entfernt. Verknüpfte Profile verlieren ihre Cookie-Definitionen.`,"cookieTemplates.editor.title.new":`Neue Cookie-Vorlage`,"cookieTemplates.editor.title.edit":`Cookie-Vorlage bearbeiten`,"cookieTemplates.editor.name":`Vorlagenname`,"cookieTemplates.editor.namePlaceholder":`z. B. Google Analytics + Ads`,"cookieTemplates.editor.nameRequired":`Vorlagenname ist erforderlich.`,"cookieTemplates.editor.definitions":`Cookie-Definitionen`,"cookieTemplates.editor.empty":`Noch keine Cookies definiert. Fügen Sie oben eines hinzu.`,"cookieTemplates.editor.addCookie":`+ Cookie hinzufügen`,"cookieTemplates.editor.error.allIds":`Alle Cookies müssen eine ID haben.`,"cookieTemplates.editor.error.uniqueIds":`Cookie-IDs müssen eindeutig sein.`,"cookieTemplates.editor.error.expiry":`Die Ablaufzeit muss mindestens 1 Tag betragen.`,"cookieTemplates.editor.error.failed":`Vorlage konnte nicht gespeichert werden.`,"cookieTemplates.editor.error.notFound":`Vorlage nicht gefunden.`,"cookieTemplates.editor.action.create":`Vorlage erstellen`,"cookieTemplates.editor.action.save":`Vorlage speichern`,"cookieTemplates.editor.showTcf":`TCF-Anbieter`,"cookieTemplates.editor.showCpra":`CPRA-Kategorie`,"cookieTemplates.editor.infoHint":`Klicken Sie auf eine Spaltenüberschrift, um mehr zu erfahren`,"cookieTemplates.editor.infoUsage":`Verwendung`,"cookieTemplates.editor.infoLaws":`Rechtliche Hinweise`,"cookieTemplates.editor.infoExamples":`Beispiele`,"cookieTemplates.col.id":`Cookie-ID`,"cookieTemplates.col.idShort":`ID / Name`,"cookieTemplates.col.legalBasis":`Rechtsgrundlage`,"cookieTemplates.col.mandatory":`Verpflichtend (immer genehmigt)`,"cookieTemplates.col.mandatoryShort":`Verpflichtend`,"cookieTemplates.col.gpc":`GPC-Signal beachten`,"cookieTemplates.col.gpcShort":`GPC`,"cookieTemplates.col.expiry":`Intervall für erneute Einwilligung (Tage)`,"cookieTemplates.col.expiryShort":`Ablauf`,"cookieTemplates.col.tcfVendor":`TCF-Anbieter-IDs`,"cookieTemplates.col.cpraCategory":`CPRA-Datenkategorie`,"cookieTemplates.col.tcfVendorShort":`TCF-Anbieter`,"cookieTemplates.col.cpraCategoryShort":`CPRA-Kategorie`,_section_uiTemplates:`── UI-Vorlagen ──────────────────────────────────`,"uiTemplates.title":`UI-Vorlagen`,"uiTemplates.count":`{{n}} Vorlagen`,"uiTemplates.countSingular":`{{n}} Vorlage`,"uiTemplates.new":`+ Neue UI-Vorlage`,"uiTemplates.empty.title":`Noch keine UI-Vorlagen.`,"uiTemplates.empty.hint":`UI-Vorlagen definieren die visuelle Konfiguration — Positionen, Schaltflächen, Kategorien — für Ihre Einwilligungsbanner und Dialoge.`,"uiTemplates.mainBanner":`Hauptbanner:`,"uiTemplates.gpcBanner":`GPC-Banner:`,"uiTemplates.modal":`Dialog:`,"uiTemplates.categories":`{{n}} Kategorien`,"uiTemplates.dialog.delete.title":`„{{name}}“ löschen?`,"uiTemplates.dialog.delete.message":`Diese UI-Vorlage wird dauerhaft entfernt. Verknüpfte Profile verlieren ihre UI-Einstellungen.`,"uiTemplates.editor.title.new":`Neue UI-Vorlage`,"uiTemplates.editor.title.edit":`UI-Vorlage bearbeiten`,"uiTemplates.editor.name":`Vorlagenname`,"uiTemplates.editor.nameRequired":`Vorlagenname ist erforderlich.`,"uiTemplates.editor.namePlaceholder":`z. B. Standard-DSGVO-Layout`,"uiTemplates.editor.loading":`Vorlage wird geladen…`,"uiTemplates.editor.tabMain":`Hauptbanner`,"uiTemplates.editor.tabGpc":`GPC-Banner`,"uiTemplates.editor.tabModal":`Präferenzdialog`,"uiTemplates.editor.mainBannerHint":`Wird beim ersten Besuch angezeigt, wenn noch keine Einwilligung erfasst wurde.`,"uiTemplates.editor.gpcBannerHint":`Wird anstelle des Hauptbanners angezeigt, wenn ein GPC-Signal erkannt wird (autoHonorGPC aktiviert).`,"uiTemplates.editor.error.notFound":`Vorlage nicht gefunden.`,"uiTemplates.editor.error.buttons":`Alle Schaltflächen müssen eine Beschriftung haben.`,"uiTemplates.editor.error.customButtons":`Bei allen „benutzerdefinierten“ Aktionsschaltflächen müssen Cookies ausgewählt sein.`,"uiTemplates.editor.error.catIds":`Alle Kategorie-IDs sind erforderlich.`,"uiTemplates.editor.error.uniqueCatIds":`Kategorie-IDs müssen eindeutig sein.`,"uiTemplates.editor.error.catCookies":`Jede Kategorie muss mindestens ein Cookie enthalten.`,"uiTemplates.editor.error.failed":`Vorlage konnte nicht gespeichert werden.`,"uiTemplates.editor.action.create":`Vorlage erstellen`,"uiTemplates.editor.action.save":`Vorlage speichern`,_section_sites:`── Websites / Mandanten ──────────────────────────`,"sites.title":`Websites / Mandanten`,"sites.createNew":`Neue Website erstellen`,"sites.namePlaceholder":`Name der Website`,"sites.slugPlaceholder":`Slug (z. B. site-a)`,"sites.col.name":`Name`,"sites.col.slug":`Slug`,"sites.col.id":`ID`,"sites.col.created":`Erstellt`,"sites.empty":`Noch keine Websites.`,"sites.dialog.delete.title":`„{{name}}“ löschen?`,"sites.dialog.delete.message":`Diese Website und alle zugehörigen Daten werden dauerhaft entfernt. Dies kann nicht rückgängig gemacht werden.`,_section_vendors:`── TCF-Anbieter ──────────────────────────────────`,"vendors.title":`TCF-Anbieterliste`,"vendors.info.title":`Was ist die TCF-Anbieterliste?`,"vendors.searchPlaceholder":`Anbieter suchen…`,"vendors.gvlMeta":`GVL v{{version}} · {{total}} Anbieter`,"vendors.loading":`Anbieterliste wird geladen…`,"vendors.noResults":`Keine Anbieter gefunden.`,"vendors.col.id":`ID`,"vendors.col.name":`Name`,"vendors.col.purposes":`Zwecke`,"vendors.col.liPurposes":`LI-Zwecke`,"vendors.col.specialPurposes":`Besondere Zwecke`,"vendors.pagination":`Seite {{page}} von {{totalPages}} · insgesamt {{total}} Anbieter`,"vendors.prev":`← Zurück`,"vendors.next":`Weiter →`,_section_audit:`── Audit-Protokoll ────────────────────────────────`,"audit.title":`Audit-Protokoll`,"audit.empty":`Noch keine Audit-Ereignisse.`,"audit.col.time":`Zeit`,"audit.col.action":`Aktion`,"audit.col.resource":`Ressource`,"audit.col.resourceId":`Ressourcen-ID`,"audit.col.actor":`Akteur`,"audit.actor.system":`System`,_section_apiConfig:`── API-Konfiguration ────────────────────────────`,"apiConfig.title":`API-Konfiguration`,"apiConfig.origins.heading":`Erlaubte Origins`,"apiConfig.origins.hint":`Nur Anfragen von diesen Origins erhalten Einwilligungsdaten. Verwenden Sie * , um alle zuzulassen (nicht für Produktion empfohlen).`,"apiConfig.origins.placeholder":`https://example.com`,"apiConfig.origins.empty":`Keine Origins konfiguriert — derzeit sind alle Origins erlaubt.`,"apiConfig.origins.errorDuplicate":`Bereits in der Liste.`,"apiConfig.origins.errorSave":`Speichern fehlgeschlagen. Bitte versuchen Sie es erneut.`,"apiConfig.origins.remove":`Entfernen`,"apiConfig.tokens.heading":`Admin-API-Token`,"apiConfig.tokens.hint":`Bearer-Token für serverseitigen und CI/CD-Zugriff auf die Consenti-Admin-API. Übergeben als Authorization: Bearer <token>. Niemals in clientseitigem Code offenlegen — diese gewähren vollständigen Admin-Zugriff.`,"apiConfig.tokens.created":`Token erstellt — kopieren Sie ihn jetzt, er wird nicht erneut angezeigt.`,"apiConfig.tokens.placeholder":`Token-Name (z. B. CI-Deployment)`,"apiConfig.tokens.empty":`Noch keine Token.`,"apiConfig.tokens.errorName":`Name ist erforderlich`,"apiConfig.tokens.errorCreate":`Token konnte nicht erstellt werden`,"apiConfig.tokens.col.name":`Name`,"apiConfig.tokens.col.status":`Status`,"apiConfig.tokens.col.created":`Erstellt`,"apiConfig.tokens.status.active":`Aktiv`,"apiConfig.tokens.status.revoked":`Widerrufen`,"apiConfig.tokens.dialog.title":`Dieses API-Token widerrufen?`,"apiConfig.tokens.dialog.message":`Jede Anwendung, die dieses Token verwendet, verliert sofort den Zugriff.`,_section_settings:`── Einstellungen ─────────────────────────────────`,"settings.title":`Einstellungen`,"settings.account.heading":`Konto`,"settings.account.email":`E-Mail:`,"settings.account.roles":`Rollen:`,"settings.account.id":`ID:`,"settings.account.changePassword":`Passwort ändern`,"settings.export.heading":`Daten exportieren`,"settings.export.hint":`Alle Einwilligungsdatensätze oder Audit-Protokolle herunterladen.`,"settings.export.consentCsv":`Einwilligungen CSV`,"settings.export.consentXlsx":`Einwilligungen XLSX`,"settings.export.consentJson":`Einwilligungen JSON`,"settings.export.auditCsv":`Audit CSV`,"settings.about.heading":`Über`,"settings.about.text":`Consenti v0.1.0 — Open-Source Consent-Management-Plattform mit DSGVO-Konformität.`,"settings.about.license":`Apache-2.0-Lizenz.`,_section_changePassword:`── Passwort ändern ──────────────────────────────`,"changePassword.title":`Passwort ändern`,"changePassword.hint":`Wählen Sie ein starkes Passwort mit mindestens 12 Zeichen.`,"changePassword.success":`Passwort erfolgreich aktualisiert.`,"changePassword.newPassword":`Neues Passwort`,"changePassword.newPasswordPlaceholder":`Mind. 12 Zeichen`,"changePassword.confirmPassword":`Neues Passwort bestätigen`,"changePassword.confirmPasswordPlaceholder":`Neues Passwort wiederholen`,"changePassword.submit":`Passwort aktualisieren`,"changePassword.submitting":`Wird gespeichert…`,"changePassword.error.minLength":`Das Passwort muss mindestens 12 Zeichen lang sein.`,"changePassword.error.mismatch":`Die Passwörter stimmen nicht überein.`,"changePassword.error.failed":`Passwort konnte nicht aktualisiert werden.`,"login.showPassword":`Show password`,"login.hidePassword":`Hide password`,"users.allowedSites":`Allowed Sites`,"users.allowedSitesHint":`(leave empty to allow all)`,"users.edit.title":`Edit User: {{name}}`,"users.edit.error.save":`Failed to save changes.`,"profileEditor.import.imported":`Imported {{n}} locales: {{list}}`,"profileEditor.import.importedSingular":`Imported 1 locale: {{list}}`,"profileEditor.import.skipped":`Skipped {{n}} unrecognised locale keys: {{list}}`,"profileEditor.import.skippedSingular":`Skipped 1 unrecognised locale key: {{list}}`,"profileEditor.config.selectDefaultLocale":`Select default locale…`,"profileEditor.config.complianceGroup":`Compliance Group`,"profileEditor.config.complianceGroupNone":`None / Custom`,"profileEditor.config.gpcMode":`GPC Signal Mode`,"profileEditor.config.gpcModeDefault":`Default (inherit from compliance group)`,"profileEditor.config.gpcModePlaceholder":`Default`,"profileEditor.config.hidePoweredBy":`Hide "Powered by Consenti"`,"profileEditor.config.hidePoweredByHint":`Remove the branding link from the consent banner.`,"profileEditor.config.allowReceipt":`Allow consent receipt`,"profileEditor.config.allowReceiptHint":`Let visitors download a PDF receipt of their consent choices.`,"profileEditor.conflict.title":`Active profile conflict`,"profileEditor.conflict.message":`Profile "{{name}}" is already active for this compliance group. Only one profile can be active per group.`,"profileEditor.conflict.deactivate":`Deactivate "{{name}}" and activate this one`,"profileEditor.conflict.saveInactive":`Save this profile as inactive`,"profileEditor.compliance.errors.heading":`Compliance errors — fix before continuing:`,"profileEditor.compliance.warnings.heading":`Compliance warnings:`,"profileEditor.compliance.warnings.acknowledge":`I acknowledge these warnings and wish to continue`,"profileEditor.content.selectLocale":`Select locale…`,"profileEditor.content.addLocale":`+ Add locale`,"profileEditor.content.defaultLocaleLabel":`(default)`,_section_readability:`── Readability Warnings ─────────────────────────`,"readability.headingTooLong":`Heading is {{n}} characters — keep it under 80 for readability.`,"readability.avgSentenceLong":`Average sentence length is {{n}} words — aim for 25 or fewer.`,"readability.totalWordsLong":`Text is {{n}} words long — consider keeping banner copy under 150 words.`,"cookieTemplates.editor.gpcMandatoryTitle":`Mandatory cookies are never auto-denied by GPC`,"cookieTemplates.editor.loadDefaultsBtn":`Click here to load default cookies list`,"cookieTemplates.editor.confirmUpdate.title":`Update template used by {{n}} profiles?`,"cookieTemplates.editor.confirmUpdate.titleSingular":`Update template used by 1 profile?`,"cookieTemplates.editor.confirmUpdate.message":`Profiles: {{names}}.
2
-
3
- Saving will update cookie definitions for all profiles using this template. Continue?`,"cookieTemplates.editor.legalBasis.mandatoryUsage":`Mandatory (Strictly Necessary): The cookie is always granted — the visitor cannot turn it off. Use only for cookies genuinely required for the site to function (session tokens, CSRF, load balancing).`,"cookieTemplates.editor.legalBasis.mandatoryLawName":`ePrivacy Dir. Recital 25`,"cookieTemplates.editor.legalBasis.mandatoryLawText":`"Strictly necessary" cookies are exempt from consent. Do not mark analytics or advertising cookies as Mandatory.`,"cookieTemplates.editor.legalBasis.examples":`Consent: analytics_storage · ad_storage · Legitimate Interest: server-side analytics · Mandatory: session · csrf_token · load_balancer_id`,"uiTemplates.editor.loadDefaultsPrompt":`Start from scratch, or load a sensible default structure (buttons, categories, positions).`,"uiTemplates.editor.loadDefaultsBtn":`Load Defaults`,"uiTemplates.editor.confirmUpdate.title":`Update template used by {{n}} profiles?`,"uiTemplates.editor.confirmUpdate.titleSingular":`Update template used by 1 profile?`,"uiTemplates.editor.confirmUpdate.message":`Profiles: {{names}}.
4
-
5
- Saving will apply UI changes to all profiles using this template. Continue?`,"uiTemplates.editor.wizard.stepOf":`Schritt {{step}} von {{total}}`,"uiTemplates.editor.wizard.next":`Weiter`,"uiTemplates.editor.wizard.back":`Zurück`,_section_howItWorks:`── So funktioniert Consenti ─────────────────────────`,"nav.howItWorks":`So funktioniert Consenti`,"howItWorks.title":`So funktioniert Consenti`,"howItWorks.intro":`Consenti ist eine Open-Source, DSGVO-konforme Consent Management Platform. Sie übernimmt die Erhebung, Speicherung und das Reporting von Cookie-Einwilligungen für Ihre Websites. Diese Anleitung führt Sie durch den Hauptworkflow und beschreibt jeden Bereich des Dashboards.`,"howItWorks.workflow.heading":`Kernworkflow`,"howItWorks.workflow.step1.title":`Cookie-Kategorien definieren`,"howItWorks.workflow.step1.desc":`Gehen Sie zu Consent-Banner → Cookie-Vorlagen und erstellen Sie eine Vorlage mit allen Cookie-Kategorien Ihrer Website (z. B. Analyse, Marketing). Legen Sie Rechtsgrundlage und Ablaufzeit für jede Kategorie fest.`,"howItWorks.workflow.step2.title":`Consent-Oberfläche gestalten`,"howItWorks.workflow.step2.desc":`Gehen Sie zu Consent-Banner → UI-Vorlagen und konfigurieren Sie das visuelle Layout Ihres Banners und des Einstellungsdialogs — Schaltflächenbeschriftungen, Farben, Layout und Kategoriedarstellung.`,"howItWorks.workflow.step3.title":`Consent-Profil erstellen`,"howItWorks.workflow.step3.desc":`Gehen Sie zu Consent-Banner → Profile und kombinieren Sie eine Cookie-Vorlage mit einer UI-Vorlage. Fügen Sie übersetzte Texte für jede unterstützte Sprache hinzu, aktivieren Sie die erforderlichen Vorschriften (DSGVO, CCPA, DPDPA) und veröffentlichen Sie.`,"howItWorks.workflow.step4.title":`Widget einbinden`,"howItWorks.workflow.step4.desc":`Kopieren Sie Ihren API-Schlüssel aus API → Konfiguration und fügen Sie das Consenti-Script-Tag zu Ihrer Website hinzu. Das Widget ruft Ihr veröffentlichtes Profil ab und zeigt das Consent-Banner automatisch an.`,"howItWorks.workflow.step5.title":`Überwachen und prüfen`,"howItWorks.workflow.step5.desc":`Nutzen Sie die Seiten Einwilligungen und Besucher, um aktuelle Consent-Datensätze einzusehen. Verwenden Sie das Audit-Log für eine manipulationssichere Historie aller Verwaltungsaktionen als Compliance-Nachweis.`,"howItWorks.features.heading":`Dashboard-Funktionen`,"howItWorks.features.dashboard.title":`Dashboard`,"howItWorks.features.dashboard.desc":`Die Startseite zeigt Echtzeit-KPIs — Gesamteinwilligungen, Akzeptanzrate, Ablehnungsrate und ein Zeitreihendiagramm. Nutzen Sie es, um Trends zu erkennen und die Auswirkungen von Banner-Änderungen zu bewerten.`,"howItWorks.features.cookieTemplates.title":`Cookie-Vorlagen`,"howItWorks.features.cookieTemplates.desc":`Wiederverwendbare Listen von Cookie-Kategorien. Jede Kategorie hat eine ID, eine Rechtsgrundlage (Einwilligung, berechtigtes Interesse, notwendig), GPC-Signalverarbeitung, Ablaufzeit und optionale TCF-Anbieter- oder CPRA-Kategorie-Zuordnung.`,"howItWorks.features.uiTemplates.title":`UI-Vorlagen`,"howItWorks.features.uiTemplates.desc":`Steuert das Erscheinungsbild des Consent-Banners, des GPC-Hinweises und des Einstellungsdialogs. Konfigurieren Sie Schaltflächensätze, Überschriften-Tags, Overlay-Transparenz und Kategoriereihenfolge.`,"howItWorks.features.profiles.title":`Profile`,"howItWorks.features.profiles.desc":`Ein Profil ist die einsetzbare Einheit. Es verbindet eine Cookie-Vorlage mit einer UI-Vorlage, speichert mehrsprachige Inhalte und verfolgt eine Versionsnummer für Rollbacks. Pro Domain kann nur ein Profil aktiv sein.`,"howItWorks.features.consents.title":`Einwilligungen`,"howItWorks.features.consents.desc":`Ein durchsuchbares, filterbares Protokoll aller von Besuchern eingereichten Einwilligungsdatensätze. Jeder Datensatz zeigt Besucher-ID, verwendetes Profil, Sprache, GPC-Signal, Einwilligungsentscheidungen und Zeitstempel.`,"howItWorks.features.visitors.title":`Besucher`,"howItWorks.features.visitors.desc":`Eine Liste eindeutiger Besucherkennungen auf Ihren Websites mit Land, Erstbesuchdatum und letztem Besuchdatum. Besucher-IDs sind pseudonyme UUIDs ohne gespeicherte IP-Adressen.`,"howItWorks.features.users.title":`Benutzer`,"howItWorks.features.users.desc":`Verwalten Sie die Admin-Konten, die sich in dieses Dashboard einloggen können. Weisen Sie Rollen zu, aktivieren oder deaktivieren Sie Konten und beschränken Sie Benutzer auf bestimmte Sites in Multi-Tenant-Deployments.`,"howItWorks.features.roles.title":`Rollen`,"howItWorks.features.roles.desc":`Definieren Sie benannte Berechtigungssätze (z. B. Betrachter, Bearbeiter, Admin). Weisen Sie granulare Berechtigungen wie consent:view, profile:edit oder audit:view jeder Rolle zu und ordnen Sie Rollen dann Benutzern zu.`,"howItWorks.features.vendors.title":`Anbieter`,"howItWorks.features.vendors.desc":`Durchsuchen Sie die IAB Global Vendor List (GVL), um TCF-Anbieter-IDs, deklarierte Zwecke und Zwecke mit berechtigtem Interesse nachzuschlagen. Verwenden Sie diese IDs beim Konfigurieren von Cookie-Kategorien in Ihren Vorlagen.`,"howItWorks.features.audit.title":`Audit-Log`,"howItWorks.features.audit.desc":`Ein nur-anhängendes, manipulationssicheres Protokoll jeder Verwaltungsaktion — Profilspeicherungen, Benutzeränderungen, API-Schlüsselerstellung und mehr. Erforderlich für die DSGVO-Rechenschaftspflicht.`,"howItWorks.features.api.title":`API & Schlüssel`,"howItWorks.features.api.desc":`Erstellen und widerrufen Sie API-Token, konfigurieren Sie erlaubte CORS-Ursprünge für die öffentliche Consent-API und durchsuchen Sie die interaktive OpenAPI-Referenz, um jeden Endpunkt zu verstehen.`,"howItWorks.features.settings.title":`Einstellungen`,"howItWorks.features.settings.desc":`Sehen Sie Ihre Kontodaten ein, ändern Sie Ihr Passwort und exportieren Sie Einwilligungs- oder Audit-Daten als CSV, XLSX oder JSON für Offline-Analysen oder behördliche Einreichungen.`,"howItWorks.docs.heading":`Vollständige Dokumentation`,"howItWorks.docs.text":`Detaillierte Anleitungen, Konfigurationsreferenzen, Integrationsbeispiele und ein Live-Playground sind auf der Consenti-Dokumentationswebsite verfügbar.`,"howItWorks.docs.link":`consenti.dev/docs öffnen →`,"howItWorks.consentFlow.heading":`Einwilligungsablauf (End-to-End)`,"howItWorks.consentFlow.step1.title":`Widget initialisiert`,"howItWorks.consentFlow.step1.desc":`Das Consenti-Skript wird im Browser des Besuchers geladen und liest Ihre Konfiguration (API-Schlüssel, compliance.type). Existiert bereits ein gültiges, nicht abgelaufenes Einwilligungs-Cookie, beendet das Widget sich lautlos — kein Banner wird angezeigt.`,"howItWorks.consentFlow.step2.title":`Jurisdiktion erkannt`,"howItWorks.consentFlow.step2.desc":`Wenn compliance.type auf 'auto' gesetzt ist, ruft das Widget GET /resolve-profile auf und übergibt Zeitzone, Accept-Language-Header und IP-Adresse des Besuchers. Der Server ordnet diese Signale anhand der integrierten Länder-zu-Compliance-Zuordnung einem complianceGroup zu.`,"howItWorks.consentFlow.step3.title":`Profil abgerufen`,"howItWorks.consentFlow.step3.desc":`Das Widget ruft das aktive Profil für die ermittelte complianceGroup und die Sprache des Besuchers ab. Die Antwort ist ein flaches JSON-Objekt mit dem gesamten Bannertext, Cookie-Kategorien, UI-Einstellungen und Regulierungsflags — bereit zur Darstellung.`,"howItWorks.consentFlow.step4.title":`Banner gerendert`,"howItWorks.consentFlow.step4.desc":`Das Widget rendert das Banner oder den Einstellungsdialog anhand der UI-Vorlage des Profils. Pflicht-Kategorien sind vorausgewählt und können nicht abgewählt werden. Optionale Kategorien zeigen ihre Rechtsgrundlage (Einwilligung oder berechtigtes Interesse).`,"howItWorks.consentFlow.step5.title":`Einwilligung übermittelt`,"howItWorks.consentFlow.step5.desc":`Wenn der Besucher handelt (Alle akzeptieren, Alle ablehnen oder Einstellungen speichern), sendet das Widget einen POST-Request mit dem Einwilligungsdatensatz an die API: Besucher-ID, Profilversion, Status je Kategorie (gewährt/verweigert/widersprochen), GPC-Signal, Zeitstempel und Sprache.`,"howItWorks.consentFlow.step6.title":`Gespeichert und geprüft`,"howItWorks.consentFlow.step6.desc":`Die API validiert die Nutzlast, speichert den Einwilligungsdatensatz und fügt einen Eintrag zum unveränderlichen Audit-Log hinzu. Der Besucherdatensatz wird mit Land und Erst-/Letztbesuch aktualisiert. Das Widget schreibt das Einwilligungs-Cookie, damit zukünftige Besuche das Banner überspringen.`,"howItWorks.profileResolution.heading":`Profilauflösungsalgorithmus`,"howItWorks.profileResolution.intro":`Wenn ein Besucher ankommt, löst Consenti in fünf Schritten auf, welches Einwilligungsprofil angezeigt werden soll.`,"howItWorks.profileResolution.step1.title":`Geo-Signale gesammelt`,"howItWorks.profileResolution.step1.desc":`Das Widget sendet drei Signale an GET /resolve-profile: die Browser-Zeitzone (Intl.DateTimeFormat), den Accept-Language-Header (oder lang-Query-Parameter) und die serverseitige IP-Adresse.`,"howItWorks.profileResolution.step2.title":`Land ermittelt`,"howItWorks.profileResolution.step2.desc":`Der Server versucht der Reihe nach: (1) IP-Geolokalisierung über den konfigurierten geoDataProvider; (2) Zeitzone-zu-Land-Tabelle; (3) Sprachtag-zu-Land-Heuristik (z. B. 'de' → DE). Der erste nicht-leere Treffer gewinnt.`,"howItWorks.profileResolution.step3.title":`Compliance-Gruppe zugeordnet`,"howItWorks.profileResolution.step3.desc":`Der ISO-3166-1-alpha-2-Ländercode (plus optionaler Regions-/Bundesstaatscode) wird in der eingebetteten LAND-zu-COMPLIANCE-Zuordnung nachgeschlagen. Eine Region-Überschreibung (z. B. US/CA → optOutCalifornia) hat Vorrang vor dem Länder-Standard.`,"howItWorks.profileResolution.step4.title":`Aktives Profil gefunden`,"howItWorks.profileResolution.step4.desc":`Das System fragt die Datenbank nach dem aktiven Profil ab, dessen complianceGroup mit der aufgelösten Gruppe übereinstimmt. Pro complianceGroup kann nur ein Profil aktiv sein. Falls keines existiert, wird 404 zurückgegeben und das Widget kann auf ein profileOverride zurückfallen.`,"howItWorks.profileResolution.step5.title":`Sprache aufgelöst`,"howItWorks.profileResolution.step5.desc":`Die beste Sprache wird gewählt durch: (1) exakte Übereinstimmung mit der angeforderten Sprache des Widgets; (2) Sprachpräfix-Übereinstimmung (z. B. 'de-AT' → 'de'); (3) vom Provider aufgelöste Sprache; (4) defaultLocale des Profils. Das aufgelöste JSON wird aus einer statischen Datei (veröffentlichte Profile) oder direkt aus der Datenbank (Vorschau) geliefert.`,"howItWorks.complianceGroups.heading":`Compliance-Gruppen`,"howItWorks.complianceGroups.intro":`Jedes Land der Welt ist einer von acht Compliance-Gruppen zugeordnet. Jede Gruppe legt fest, welches Einwilligungsmodell das Widget einhalten muss.`,"howItWorks.complianceGroups.optIn.title":`optIn — DSGVO / ePrivacy Striktes Opt-In`,"howItWorks.complianceGroups.optIn.desc":`Vor dem Setzen nicht notwendiger Cookies ist eine vorherige Einwilligung erforderlich. Besucher müssen die Möglichkeit haben, abzulehnen; der Widerruf muss so einfach sein wie die Einwilligung; granulare Kategorieauswahl ist Pflicht.`,"howItWorks.complianceGroups.optIn.laws":`DSGVO, ePrivacy-Richtlinie, UK DSGVO, PECR, revDSG (CH), KVKK (TR), PDPA (TH) und weitere strenge nationale Gesetze`,"howItWorks.complianceGroups.optIn.countries":`Alle EU-Mitgliedstaaten, UK, Schweiz, Türkei, Thailand, Island, Liechtenstein, Norwegen, Guernsey, Gibraltar und weitere Länder mit strikten ePrivacy-Regeln`,"howItWorks.complianceGroups.optInDPDPA.title":`optInDPDPA — Indien DPDPA`,"howItWorks.complianceGroups.optInDPDPA.desc":`Indiens Digital Personal Data Protection Act 2023 erfordert eine ausdrückliche Opt-in-Einwilligung. Zusätzliche Pflichten: Benennung eines Data Fiduciary, dedizierte Einwilligungsmitteilung und Unterstützung der Rechte von Data Principals. Setzen Sie das Feld dpdpaDataFiduciary in Ihrem Profil.`,"howItWorks.complianceGroups.optInDPDPA.laws":`Digital Personal Data Protection Act 2023 (DPDPA)`,"howItWorks.complianceGroups.optInDPDPA.countries":`Indien (IN)`,"howItWorks.complianceGroups.optInChina.title":`optInChina — China Multi-Gesetzes-Rahmen`,"howItWorks.complianceGroups.optInChina.desc":`Chinas Datenschutz erfordert ausdrückliche Einwilligung gemäß PIPL, ergänzt durch Pflichten aus dem Datensicherheitsgesetz (DSL) und dem Cybersicherheitsgesetz (CSL). Weitere Anforderungen gelten für grenzüberschreitende Datenübermittlungen und Datenklassifizierung.`,"howItWorks.complianceGroups.optInChina.laws":`Datenschutzgesetz für personenbezogene Daten (PIPL), Datensicherheitsgesetz (DSL), Cybersicherheitsgesetz (CSL)`,"howItWorks.complianceGroups.optInChina.countries":`China (CN)`,"howItWorks.complianceGroups.optOutCalifornia.title":`optOutCalifornia — Kalifornien CCPA / CPRA`,"howItWorks.complianceGroups.optOutCalifornia.desc":`Daten dürfen standardmäßig erhoben werden, aber Verbraucher müssen eine klare Opt-out-Möglichkeit erhalten. Das Global Privacy Control (GPC)-Browsersignal muss als gültiger Opt-out anerkannt werden.`,"howItWorks.complianceGroups.optOutCalifornia.laws":`CCPA, CPRA (California Consumer Privacy Act / California Privacy Rights Act)`,"howItWorks.complianceGroups.optOutCalifornia.countries":`USA — Kalifornien (US/CA)`,"howItWorks.complianceGroups.optOutUSState.title":`optOutUSState — Andere US-Bundesstaaten`,"howItWorks.complianceGroups.optOutUSState.desc":`Nach dem Vorbild des kalifornischen Opt-out-Rahmens. Verbraucher können der Nutzung für zielgerichtete Werbung und dem Verkauf personenbezogener Daten widersprechen. In einigen Bundesstaaten muss das GPC-Signal anerkannt werden.`,"howItWorks.complianceGroups.optOutUSState.laws":`CDPA (VA), CPA (CO), CTDPA (CT), UCPA (UT), TDPSA (TX), DPDPA (DE), NJDPA (NJ), OCPA (OR), MCDPA (MN), MODPA (MD), KCDPA (KY), TIPA (TN), NDPA (NE), ICDPA (IA/IN), MCDPA (MT), NHPA (NH), RIDTPA (RI)`,"howItWorks.complianceGroups.optOutUSState.countries":`USA — VA, CO, CT, UT, TX, DE, NJ, OR, MN, MD, KY, TN, NE, IA, IN, MT, NH, RI`,"howItWorks.complianceGroups.generalPrivacyConsent.title":`generalPrivacyConsent — Allgemeines Datenschutz-Recht`,"howItWorks.complianceGroups.generalPrivacyConsent.desc":`Ein allgemeines Datenschutzgesetz gilt, schreibt aber kein striktes PECR-/ePrivacy-artiges Cookie-Banner vor. Best Practice ist eine Einwilligungsmöglichkeit für nicht notwendige Cookies und eine klare Datenschutzmitteilung; die rechtliche Anforderung liegt jedoch unter dem DSGVO-Opt-in-Standard.`,"howItWorks.complianceGroups.generalPrivacyConsent.laws":`PIPEDA / Law 25 (CA), LGPD (BR — hybridBrazil verwenden), POPIA (ZA), APPI (JP), Privacy Act (AU/NZ), PDPA-SG, PDPA-MY, PIPA-KR, PDPD-VN, DPA-PH, PDP-ID und viele weitere`,"howItWorks.complianceGroups.generalPrivacyConsent.countries":`Kanada, Australien, Neuseeland, Japan, Südkorea, Singapur, Malaysia, Südafrika sowie viele lateinamerikanische, afrikanische und asiatische Länder`,"howItWorks.complianceGroups.hybridBrazil.title":`hybridBrazil — Brasilien LGPD`,"howItWorks.complianceGroups.hybridBrazil.desc":`Brasiliens LGPD ähnelt der DSGVO, erlaubt jedoch je nach Bewertung des Verantwortlichen für Analyse- und Werbecookies berechtigte Interessen als Rechtsgrundlage. Das Banner wird angezeigt, aber die kategorienspezifische Rechtsgrundlage kann differenzierter sein als beim strikten DSGVO-Opt-in.`,"howItWorks.complianceGroups.hybridBrazil.laws":`Lei Geral de Proteção de Dados (LGPD)`,"howItWorks.complianceGroups.hybridBrazil.countries":`Brasilien (BR)`,"howItWorks.complianceGroups.noticeOnly.title":`noticeOnly — Nur Datenschutzhinweis`,"howItWorks.complianceGroups.noticeOnly.desc":`Es gilt keine spezielle Cookie-Regelung, oder das geltende Regime erfordert lediglich einen Datenschutzhinweis — kein Opt-in- oder Opt-out-Banner. Ein Consent-Banner wird aus Transparenzgründen empfohlen, ist aber nicht gesetzlich vorgeschrieben.`,"howItWorks.complianceGroups.noticeOnly.laws":`Variiert — Länder ohne dedizierte Cookie-/ePrivacy-Regelung`,"howItWorks.complianceGroups.noticeOnly.countries":`Viele Länder in Afrika, Zentralasien, der Karibik und dem Pazifikraum, die nicht durch die oben genannten Gruppen abgedeckt sind`,"howItWorks.enums.heading":`Referenz wichtiger Werte`,"howItWorks.enums.legalBasis.heading":`legalBasis (Cookie-Kategorie)`,"howItWorks.enums.legalBasis.mandatory":`mandatory — Kategorie ist unabhängig von der Einwilligung immer aktiv (z. B. Sitzung, Authentifizierung). Wird nicht durch GPC oder Opt-out-Signale blockiert.`,"howItWorks.enums.legalBasis.consent":`consent — Erfordert ausdrückliches Opt-in des Besuchers. Standardmäßig blockiert; in allen Opt-in-Jurisdiktionen durch GPC blockiert.`,"howItWorks.enums.legalBasis.legitimateInterest":`legitimate_interest — Stützt sich auf das berechtigte Interesse des Verantwortlichen. Standardmäßig aktiv; Besucher kann widersprechen. In einigen Jurisdiktionen (EU, UK) durch GPC soft-blockiert.`,"howItWorks.enums.consentStatus.heading":`ConsentStatus (je Kategorie-Datensatz)`,"howItWorks.enums.consentStatus.granted":`granted — Besucher hat ausdrücklich eingewilligt.`,"howItWorks.enums.consentStatus.denied":`denied — Besucher hat die Einwilligung ausdrücklich verweigert.`,"howItWorks.enums.consentStatus.objected":`objected — Besucher hat einer Kategorie mit berechtigtem Interesse widersprochen (Opt-out, keine Einwilligungsverweigerung).`,"howItWorks.enums.geoProvider.heading":`geoDataProvider-Optionen`,"howItWorks.enums.geoProvider.default":`default / timezone — Nutzt die Browser-Zeitzone (Intl.DateTimeFormat) zur Länderermittlung; Rückfall auf Accept-Language. Keine zusätzliche Abhängigkeit.`,"howItWorks.enums.geoProvider.language":`language — Leitet das Land nur aus dem Accept-Language-Header ab (z. B. 'de' → DE, 'pt' → BR). Schnell, aber ungenau.`,"howItWorks.enums.geoProvider.geoip":`geoip — Verwendet das npm-Paket geoip-lite mit einer gebündelten MaxMind-Lite-Datenbank. Erforderlich: npm install geoip-lite.`,"howItWorks.enums.geoProvider.hostedGeoipLite":`hosted-geoip-lite — Ruft ipinfo.io über integriertes HTTPS auf (keine zusätzliche Abhängigkeit). Fügt ~50–200 ms je Erstbesuch hinzu.`,"howItWorks.enums.geoProvider.maxmind":`maxmind — Verwendet das npm-Paket maxmind mit einer lokalen GeoLite2-City.mmdb-Datei. Am genauesten. Erfordert MAXMIND_DB_PATH-Umgebungsvariable und npm install maxmind.`,"howItWorks.enums.geoProvider.custom":`Benutzerdefinierte Funktion — Übergeben Sie eine CountryResolverFn an compliance.geoDataProvider, um einen beliebigen Geo-IP- oder CDN-Anbieter zu integrieren.`};export{e as default};
@@ -1,5 +0,0 @@
1
- var e={_section_nav:`── Navegación ──────────────────────────────────────────`,"nav.dashboard":`Panel`,"nav.consentBanners":`Banners de consentimiento`,"nav.cookieTemplates":`Plantillas de cookies`,"nav.uiTemplates":`Plantillas de UI`,"nav.profiles":`Perfiles`,"nav.consents":`Consentimientos`,"nav.visitors":`Visitantes`,"nav.users":`Usuarios`,"nav.roles":`Roles`,"nav.sites":`Sitios`,"nav.vendors":`Proveedores TCF`,"nav.audit":`Registro de auditoría`,"nav.api":`API`,"nav.apiConfig":`Configuración`,"nav.apiDocs":`Documentación de endpoints`,"nav.settings":`Ajustes`,"nav.adminDashboard":`Panel de administración`,_section_layout:`── Diseño ───────────────────────────────────────────`,"layout.expandSidebar":`Expandir barra lateral`,"layout.collapseSidebar":`Contraer barra lateral`,"layout.signOut":`Cerrar sesión`,"layout.toggleDark":`Cambiar a modo oscuro`,"layout.toggleLight":`Cambiar a modo claro`,"layout.poweredBy":`Desarrollado por`,_section_common:`── Común ───────────────────────────────────────────`,"common.loading":`Cargando…`,"common.save":`Guardar`,"common.saving":`Guardando…`,"common.cancel":`Cancelar`,"common.close":`Cerrar`,"common.delete":`Eliminar`,"common.edit":`Editar`,"common.create":`Crear`,"common.confirm":`Confirmar`,"common.noData":`Sin datos`,"common.exportCsv":`Exportar CSV`,"common.duplicate":`Duplicar`,"common.active":`Activo`,"common.inactive":`Inactivo`,"common.name":`Nombre`,"common.email":`Correo electrónico`,"common.status":`Estado`,"common.created":`Creado`,"common.id":`ID`,"common.add":`Añadir`,"common.remove":`Eliminar`,"common.revoke":`Revocar`,"common.required":`Obligatorio`,"common.version":`Versión`,"common.locale":`Configuración regional`,"common.country":`País`,"common.source":`Origen`,"common.grantAll":`Conceder todo`,"common.revokeAll":`Revocar todo`,"common.granted":`concedido`,"common.page":`Página {{n}}`,"common.prev":`Anterior`,"common.next":`Siguiente`,"common.you":`Tú`,"common.default":`predeterminado`,"common.hide":`Ocultar`,"common.show":`Mostrar`,"common.activate":`Activar`,"common.deactivate":`Desactivar`,"common.newRole":`Nuevo rol`,"common.copyToClipboard":`Copiar al portapapeles`,"common.back":`Atrás`,"common.copyId":`Copiar ID`,"common.mandatory":`obligatorio`,"common.optional":`Opcional`,"common.roles":`Roles`,"common.showPassword":`Mostrar contraseña`,"common.hidePassword":`Ocultar contraseña`,"common.updated":`Actualizado`,_section_locale:`── Selector de idioma ─────────────────────────────`,"locale.en":`Inglés`,"locale.switcherAria":`Cambiar idioma`,_section_login:`── Inicio de sesión ───────────────────────────────`,"login.title":`{{appName}} Admin`,"login.subtitle":`Inicia sesión en tu cuenta`,"login.email":`Correo electrónico`,"login.emailPlaceholder":`admin@example.com`,"login.password":`Contraseña`,"login.submit":`Iniciar sesión`,"login.submitting":`Iniciando sesión…`,"login.error.invalid":`Correo electrónico o contraseña no válidos`,"login.devSignIn":`⚡ Dev: iniciar sesión como user@consenti.dev`,_section_dashboard:`── Panel ─────────────────────────────────────────`,"dashboard.title":`Panel`,"dashboard.stats.totalConsents":`Consentimientos totales`,"dashboard.stats.totalVisitors":`Visitantes totales`,"dashboard.stats.accepted":`Aceptados`,"dashboard.stats.acceptedSub":`≥80% de cookies concedidas`,"dashboard.stats.rejected":`Rechazados`,"dashboard.stats.rejectedSub":`≤20% de cookies concedidas`,"dashboard.chart.timeline":`Consentimientos (últimos 30 días)`,"dashboard.chart.timelineAria":`Gráfico de la línea de tiempo de consentimientos`,"dashboard.chart.countries":`Principales países`,"dashboard.chart.noData":`Sin datos.`,"dashboard.chart.noCountryData":`Sin datos de países.`,"dashboard.gpc.label":`Tasa de detección de GPC`,"dashboard.gpc.sub":`{{detected}} de {{total}} consentimientos`,_section_consents:`── Consentimientos ───────────────────────────────`,"consents.title":`Registros de consentimiento`,"consents.filterFrom":`Desde`,"consents.filterTo":`Hasta`,"consents.filterGpc":`Solo GPC`,"consents.records":`{{n}} registros`,"consents.empty":`Aún no hay registros de consentimiento.`,"consents.col.visitorId":`ID del visitante`,"consents.col.profile":`Perfil`,"consents.col.locale":`Configuración regional`,"consents.col.gpc":`GPC`,"consents.col.age":`Edad`,"consents.col.source":`Origen`,"consents.col.created":`Creado`,"consents.gpcYes":`Sí`,"consents.ageVerified":`Verificado`,_section_visitors:`── Visitantes ───────────────────────────────────`,"visitors.title":`Visitantes`,"visitors.empty":`Aún no hay visitantes registrados.`,"visitors.col.visitorId":`ID del visitante`,"visitors.col.country":`País`,"visitors.col.firstSeen":`Primera vez visto`,"visitors.col.lastSeen":`Última vez visto`,_section_users:`── Usuarios ──────────────────────────────────────`,"users.title":`Usuarios`,"users.count":`{{n}} usuarios`,"users.newUser":`+ Nuevo usuario`,"users.createForm.title":`Crear usuario`,"users.createForm.namePlaceholder":`Nombre`,"users.createForm.emailPlaceholder":`Correo electrónico`,"users.createForm.passwordPlaceholder":`Contraseña`,"users.createForm.confirmPasswordPlaceholder":`Confirmar contraseña`,"users.createForm.selectRole":`Seleccionar rol…`,"users.createForm.passwordMismatch":`Las contraseñas no coinciden`,"users.createForm.error":`No se pudo crear el usuario`,"users.col.status":`Estado`,"users.status.active":`Activo`,"users.status.inactive":`Inactivo`,"users.action.activate":`Activar`,"users.action.deactivate":`Desactivar`,"users.dialog.delete.title":`¿Eliminar al usuario "{{name}}"?`,"users.dialog.delete.message":`Esta cuenta de usuario se eliminará de forma permanente.`,_section_roles:`── Roles y permisos ─────────────────────────────`,"roles.title":`Roles y permisos`,"roles.list.heading":`Roles`,"roles.list.empty":`Aún no hay roles. Crea uno para empezar.`,"roles.form.roleNameLabel":`Nombre del rol`,"roles.form.roleNamePlaceholder":`p. ej., Editor`,"roles.form.descriptionLabel":`Descripción`,"roles.form.descriptionPlaceholder":`Descripción opcional`,"roles.perms.heading":`Permisos — {{name}}`,"roles.perms.selectPrompt":`Selecciona un rol para gestionar los permisos`,"roles.perms.clickPrompt":`Haz clic en un rol a la izquierda para ver y gestionar sus permisos.`,"roles.perms.noPerms":`No hay permisos definidos en el sistema.`,"roles.error.load":`No se pudieron cargar los roles.`,"roles.error.create":`No se pudo crear el rol.`,"roles.error.update":`No se pudo actualizar el rol.`,"roles.error.delete":`No se pudo eliminar el rol.`,"roles.error.perm":`No se pudo actualizar el permiso.`,"roles.dialog.delete.title":`¿Eliminar el rol "{{name}}"?`,"roles.dialog.delete.message":`Los usuarios asignados a este rol perderán sus permisos inmediatamente.`,"roles.aria.editRole":`Editar rol`,"roles.aria.deleteRole":`Eliminar rol`,_section_profiles:`── Perfiles ──────────────────────────────────────`,"profiles.title":`Perfiles`,"profiles.count":`{{n}} perfiles`,"profiles.countSingular":`{{n}} perfil`,"profiles.newProfile":`+ Nuevo perfil`,"profiles.empty":`Aún no hay perfiles. Crea uno para empezar.`,"profiles.col.name":`Nombre`,"profiles.col.defaultLocale":`Configuración regional predeterminada`,"profiles.col.version":`Versión`,"profiles.col.templates":`Plantillas`,"profiles.col.created":`Creado`,"profiles.template.cookie":`Cookie:`,"profiles.template.ui":`UI:`,"profiles.action.copyId":`Copiar ID del perfil`,"profiles.action.copying":`Copiando…`,"profiles.dialog.delete.title":`¿Eliminar "{{name}}"?`,"profiles.dialog.delete.message":`Este perfil y todo su contenido de idioma se eliminarán de forma permanente.`,"profiles.dialog.copy.title":`¿Copiar "{{name}}"?`,"profiles.dialog.copy.message":`Este perfil y todo su contenido de idioma se duplicarán.`,_section_profileEditor:`── Editor de perfiles ────────────────────────────`,"profileEditor.title.new":`Nuevo perfil`,"profileEditor.title.edit":`Editar perfil`,"profileEditor.title.loading":`Editor de perfiles`,"profileEditor.step.config":`Configuración del perfil`,"profileEditor.step.templates":`Plantillas`,"profileEditor.step.content":`Contenido`,"profileEditor.step.mainBanner":`Banner principal`,"profileEditor.step.gpcBanner":`Banner GPC`,"profileEditor.step.prefModal":`Modal de preferencias`,"profileEditor.config.profileName":`Nombre del perfil`,"profileEditor.config.profileNamePlaceholder":`Mi sitio web`,"profileEditor.config.defaultLocale":`Configuración regional predeterminada`,"profileEditor.config.allowedDomains":`Dominios permitidos`,"profileEditor.config.allowedDomainsHint":`Admite comodines (*.example.com). Déjalo vacío para permitir todos.`,"profileEditor.config.regulations":`Regulaciones de cumplimiento`,"profileEditor.config.reg.gdprLabel":`RGPD`,"profileEditor.config.reg.gdprDesc":`Opt-in UE/EEE. No se realiza seguimiento hasta que se otorgue el consentimiento. El banner se muestra en la primera visita.`,"profileEditor.config.reg.ccpaLabel":`CCPA`,"profileEditor.config.reg.ccpaDesc":`Opt-out para California. Las cookies se conceden por defecto. Proporciona un disparador de "No vender".`,"profileEditor.config.reg.cpraLabel":`CPRA`,"profileEditor.config.reg.cpraDesc":`California 2023. Opt-out para venta/compartición; opt-in para datos sensibles. GPC respetado.`,"profileEditor.config.reg.dpdpaLabel":`DPDPA`,"profileEditor.config.reg.dpdpaDesc":`India 2023. Opt-in como RGPD. GPC no reconocido. Se requiere aviso del fiduciario de datos.`,"profileEditor.config.darkMode":`Activar modo oscuro`,"profileEditor.config.darkModeHint":`Aplica tokens de color oscuros al widget de consentimiento para sitios con tema oscuro.`,"profileEditor.config.dpdpa.heading":`DPDPA — Campos obligatorios del aviso de consentimiento`,"profileEditor.config.dpdpa.fiduciary":`Nombre del fiduciario de datos`,"profileEditor.config.dpdpa.fiduciaryPlaceholder":`Acme Corp Pvt Ltd`,"profileEditor.config.dpdpa.grievanceEmail":`Correo electrónico del responsable de quejas`,"profileEditor.config.dpdpa.grievanceEmailPlaceholder":`grievance@acme.com`,"profileEditor.config.dpdpa.purpose":`Descripción del propósito`,"profileEditor.config.dpdpa.purposePlaceholder":`Recopilamos tus datos para personalizar tu experiencia…`,"profileEditor.templates.cookieTemplate":`Plantilla de cookie`,"profileEditor.templates.cookieTemplateHint":`Define qué cookies/propósitos aparecen en el modal de preferencias. Todos los campos se derivan de la plantilla — de solo lectura en el perfil.`,"profileEditor.templates.selectCookie":`— Selecciona una plantilla de cookie —`,"profileEditor.templates.uiTemplate":`Plantilla de UI`,"profileEditor.templates.uiTemplateHint":`Define la disposición del banner/modal, la cantidad de botones y la estructura de categorías. Agrega el texto en los pasos 3–5.`,"profileEditor.templates.selectUi":`— Selecciona una plantilla de UI —`,"profileEditor.templates.noTemplate":`No se ha seleccionado ninguna plantilla.`,"profileEditor.templates.previewPrompt":`Selecciona una plantilla de cookie y una plantilla de UI para ver una vista previa en vivo.`,"profileEditor.templates.categoriesCount":`categorías`,"profileEditor.templates.buttonsTotal":`botones en total`,"profileEditor.content.loadDefaults":`Cargar valores predeterminados`,"profileEditor.content.loadDefaultsTitle":`Rellenar esta sección con valores predeterminados en inglés`,"profileEditor.content.loadDefaultsNotice":`Los valores predeterminados son solo en inglés — tradúcelos usando la pestaña de idioma de arriba.`,"profileEditor.content.importError":`No se pudo analizar el archivo cargado. Asegúrate de que coincida con el formato de plantilla de idioma de Consenti.`,"profileEditor.content.mainBanner":`Banner principal`,"profileEditor.content.gpcBanner":`Banner GPC`,"profileEditor.content.prefModal":`Modal de preferencias`,"profileEditor.content.heading":`Encabezado`,"profileEditor.content.subheading":`Subencabezado`,"profileEditor.content.bodyText":`Texto principal`,"profileEditor.content.introText":`Texto de introducción (opcional)`,"profileEditor.content.buttonLabels":`Etiquetas de botones`,"profileEditor.content.categoryHeading":`Encabezado de categoría`,"profileEditor.content.categoryDesc":`Descripción de categoría`,"profileEditor.content.categoryFallback":`Categoría {{n}}`,"profileEditor.content.categoryDescPlaceholder":`Descripción de esta categoría de cookies…`,"profileEditor.content.mainBannerHeadingPlaceholder":`Valoramos tu privacidad`,"profileEditor.content.mainBannerBodyPlaceholder":`Usamos cookies para mejorar tu experiencia…`,"profileEditor.content.gpcHeadingPlaceholder":`Se detectó Global Privacy Control`,"profileEditor.content.prefHeadingPlaceholder":`Preferencias de privacidad`,"profileEditor.content.prefSubheadingPlaceholder":`Gestiona tus preferencias de cookies a continuación.`,"profileEditor.content.prefIntroPlaceholder":`Introducción opcional sobre las categorías…`,"profileEditor.content.noContent":`Selecciona una plantilla de UI en el paso 2 para comenzar a editar el contenido.`,"profileEditor.content.loadingTemplate":`Cargando plantilla…`,"profileEditor.nav.nextTemplates":`Siguiente: Plantillas`,"profileEditor.nav.nextContent":`Siguiente: Contenido`,"profileEditor.nav.nextMainBanner":`Siguiente: Banner principal`,"profileEditor.nav.nextGpcBanner":`Siguiente: Banner GPC`,"profileEditor.nav.nextPrefModal":`Siguiente: Modal de preferencias`,"profileEditor.action.create":`Crear perfil`,"profileEditor.action.save":`Guardar perfil`,"profileEditor.error.nameRequired":`El nombre del perfil es obligatorio.`,"profileEditor.error.nameRequiredContinue":`El nombre del perfil es obligatorio antes de continuar.`,"profileEditor.error.cookieRequired":`Selecciona una plantilla de cookie.`,"profileEditor.error.cookieContinue":`Selecciona una plantilla de cookie para continuar.`,"profileEditor.error.uiRequired":`Selecciona una plantilla de UI.`,"profileEditor.error.uiContinue":`Selecciona una plantilla de UI para continuar.`,"profileEditor.error.failed":`No se pudo guardar el perfil.`,"profileEditor.error.load":`No se pudo cargar el perfil.`,"profileEditor.table.noNoCookies":`No hay cookies definidas en esta plantilla.`,"profileEditor.table.id":`ID`,"profileEditor.table.legalBasis":`Base legal`,"profileEditor.table.mandatory":`Obligatorio`,"profileEditor.table.gpc":`GPC`,"profileEditor.table.expiry":`Caducidad`,"profileEditor.table.tcfVendor":`Proveedor TCF`,"profileEditor.table.cpraCategory":`Categoría CPRA`,"profileEditor.export.json":`JSON`,"profileEditor.export.csv":`CSV`,"profileEditor.export.import":`Importar`,"profileEditor.export.jsonTitle":`Descargar contenido de idioma como JSON`,"profileEditor.export.csvTitle":`Descargar contenido de idioma como CSV para traducción`,"profileEditor.export.importTitle":`Subir JSON o CSV traducido`,"profileEditor.newLink":`+ Nuevo ↗`,_section_cookieTemplates:`── Plantillas de cookies ─────────────────────────`,"cookieTemplates.title":`Plantillas de cookies`,"cookieTemplates.count":`{{n}} plantillas`,"cookieTemplates.countSingular":`{{n}} plantilla`,"cookieTemplates.new":`+ Nueva plantilla de cookies`,"cookieTemplates.empty.title":`Aún no hay plantillas de cookies.`,"cookieTemplates.empty.hint":`Las plantillas de cookies definen la lista de cookies/propósitos para tus perfiles de consentimiento. Crea una para reutilizarla en varios perfiles.`,"cookieTemplates.required":`obligatorio`,"cookieTemplates.dialog.delete.title":`¿Eliminar "{{name}}"?`,"cookieTemplates.dialog.delete.message":`Esta plantilla de cookies se eliminará de forma permanente. Los perfiles vinculados perderán sus definiciones de cookies.`,"cookieTemplates.editor.title.new":`Nueva plantilla de cookies`,"cookieTemplates.editor.title.edit":`Editar plantilla de cookies`,"cookieTemplates.editor.name":`Nombre de la plantilla`,"cookieTemplates.editor.namePlaceholder":`p. ej., Google Analytics + Ads`,"cookieTemplates.editor.nameRequired":`El nombre de la plantilla es obligatorio.`,"cookieTemplates.editor.definitions":`Definiciones de cookies`,"cookieTemplates.editor.empty":`Aún no hay cookies definidas. Añade una arriba.`,"cookieTemplates.editor.addCookie":`+ Añadir cookie`,"cookieTemplates.editor.error.allIds":`Todas las cookies deben tener un ID.`,"cookieTemplates.editor.error.uniqueIds":`Los IDs de cookie deben ser únicos.`,"cookieTemplates.editor.error.expiry":`La caducidad debe ser de al menos 1 día.`,"cookieTemplates.editor.error.failed":`No se pudo guardar la plantilla.`,"cookieTemplates.editor.error.notFound":`Plantilla no encontrada.`,"cookieTemplates.editor.action.create":`Crear plantilla`,"cookieTemplates.editor.action.save":`Guardar plantilla`,"cookieTemplates.editor.showTcf":`Proveedores TCF`,"cookieTemplates.editor.showCpra":`Categoría CPRA`,"cookieTemplates.editor.infoHint":`Haz clic en un encabezado de columna para obtener más información`,"cookieTemplates.editor.infoUsage":`Uso`,"cookieTemplates.editor.infoLaws":`Orientación regulatoria`,"cookieTemplates.editor.infoExamples":`Ejemplos`,"cookieTemplates.col.id":`ID de cookie`,"cookieTemplates.col.idShort":`ID / Nombre`,"cookieTemplates.col.legalBasis":`Base legal`,"cookieTemplates.col.mandatory":`Obligatorio (siempre concedido)`,"cookieTemplates.col.mandatoryShort":`Obligatorio`,"cookieTemplates.col.gpc":`Respetar señal GPC`,"cookieTemplates.col.gpcShort":`GPC`,"cookieTemplates.col.expiry":`Intervalo de renovación del consentimiento (días)`,"cookieTemplates.col.expiryShort":`Caducidad`,"cookieTemplates.col.tcfVendor":`IDs de proveedores TCF`,"cookieTemplates.col.cpraCategory":`Categoría de datos CPRA`,"cookieTemplates.col.tcfVendorShort":`Proveedor TCF`,"cookieTemplates.col.cpraCategoryShort":`Categoría CPRA`,_section_uiTemplates:`── Plantillas de UI ──────────────────────────────`,"uiTemplates.title":`Plantillas de UI`,"uiTemplates.count":`{{n}} plantillas`,"uiTemplates.countSingular":`{{n}} plantilla`,"uiTemplates.new":`+ Nueva plantilla de UI`,"uiTemplates.empty.title":`Aún no hay plantillas de UI.`,"uiTemplates.empty.hint":`Las plantillas de UI definen la configuración visual — posiciones, botones, categorías — de tus banners y modales de consentimiento.`,"uiTemplates.mainBanner":`Banner principal:`,"uiTemplates.gpcBanner":`Banner GPC:`,"uiTemplates.modal":`Modal:`,"uiTemplates.categories":`{{n}} categorías`,"uiTemplates.dialog.delete.title":`¿Eliminar "{{name}}"?`,"uiTemplates.dialog.delete.message":`Esta plantilla de UI se eliminará de forma permanente. Los perfiles vinculados perderán sus ajustes de UI.`,"uiTemplates.editor.title.new":`Nueva plantilla de UI`,"uiTemplates.editor.title.edit":`Editar plantilla de UI`,"uiTemplates.editor.name":`Nombre de la plantilla`,"uiTemplates.editor.nameRequired":`El nombre de la plantilla es obligatorio.`,"uiTemplates.editor.namePlaceholder":`p. ej., Diseño estándar RGPD`,"uiTemplates.editor.loading":`Cargando plantilla…`,"uiTemplates.editor.tabMain":`Banner principal`,"uiTemplates.editor.tabGpc":`Banner GPC`,"uiTemplates.editor.tabModal":`Modal de preferencias`,"uiTemplates.editor.mainBannerHint":`Se muestra en la primera visita cuando aún no se ha registrado el consentimiento.`,"uiTemplates.editor.gpcBannerHint":`Se muestra en lugar del banner principal cuando se detecta una señal GPC (autoHonorGPC activado).`,"uiTemplates.editor.error.notFound":`Plantilla no encontrada.`,"uiTemplates.editor.error.buttons":`Todos los botones deben tener una etiqueta.`,"uiTemplates.editor.error.customButtons":`Todos los botones de acción "personalizados" deben tener cookies seleccionadas.`,"uiTemplates.editor.error.catIds":`Todos los IDs de categoría son obligatorios.`,"uiTemplates.editor.error.uniqueCatIds":`Los IDs de categoría deben ser únicos.`,"uiTemplates.editor.error.catCookies":`Cada categoría debe incluir al menos una cookie.`,"uiTemplates.editor.error.failed":`No se pudo guardar la plantilla.`,"uiTemplates.editor.action.create":`Crear plantilla`,"uiTemplates.editor.action.save":`Guardar plantilla`,_section_sites:`── Sitios / Inquilinos ─────────────────────────────`,"sites.title":`Sitios / Inquilinos`,"sites.createNew":`Crear sitio nuevo`,"sites.namePlaceholder":`Nombre del sitio`,"sites.slugPlaceholder":`slug (p. ej., site-a)`,"sites.col.name":`Nombre`,"sites.col.slug":`Slug`,"sites.col.id":`ID`,"sites.col.created":`Creado`,"sites.empty":`Aún no hay sitios.`,"sites.dialog.delete.title":`¿Eliminar "{{name}}"?`,"sites.dialog.delete.message":`Este sitio y todos los datos asociados se eliminarán de forma permanente. Esto no se puede deshacer.`,_section_vendors:`── Proveedores TCF ─────────────────────────────────`,"vendors.title":`Lista de proveedores TCF`,"vendors.info.title":`¿Qué es la lista de proveedores TCF?`,"vendors.searchPlaceholder":`Buscar proveedores…`,"vendors.gvlMeta":`GVL v{{version}} · {{total}} proveedores`,"vendors.loading":`Cargando lista de proveedores…`,"vendors.noResults":`No se encontraron proveedores.`,"vendors.col.id":`ID`,"vendors.col.name":`Nombre`,"vendors.col.purposes":`Propósitos`,"vendors.col.liPurposes":`Propósitos de interés legítimo`,"vendors.col.specialPurposes":`Propósitos especiales`,"vendors.pagination":`Página {{page}} de {{totalPages}} · {{total}} proveedores en total`,"vendors.prev":`← Anterior`,"vendors.next":`Siguiente →`,_section_audit:`── Registro de auditoría ─────────────────────────`,"audit.title":`Registro de auditoría`,"audit.empty":`Aún no hay eventos de auditoría.`,"audit.col.time":`Hora`,"audit.col.action":`Acción`,"audit.col.resource":`Recurso`,"audit.col.resourceId":`ID del recurso`,"audit.col.actor":`Actor`,"audit.actor.system":`sistema`,_section_apiConfig:`── Configuración de la API ───────────────────────`,"apiConfig.title":`Configuración de la API`,"apiConfig.origins.heading":`Orígenes permitidos`,"apiConfig.origins.hint":`Solo las solicitudes desde estos orígenes recibirán datos de consentimiento. Usa * para permitir todos (no recomendado en producción).`,"apiConfig.origins.placeholder":`https://example.com`,"apiConfig.origins.empty":`No hay orígenes configurados: actualmente se permiten todos los orígenes.`,"apiConfig.origins.errorDuplicate":`Ya está en la lista.`,"apiConfig.origins.errorSave":`No se pudo guardar. Inténtalo de nuevo.`,"apiConfig.origins.remove":`Eliminar`,"apiConfig.tokens.heading":`Tokens de API de administrador`,"apiConfig.tokens.hint":`Tokens Bearer para acceso del servidor y CI/CD a la API de administración de Consenti. Pásalos como Authorization: Bearer <token>. Nunca los expongas en código del lado del cliente: conceden acceso administrativo completo.`,"apiConfig.tokens.created":`Token creado: cópialo ahora, no se volverá a mostrar.`,"apiConfig.tokens.placeholder":`Nombre del token (p. ej., despliegue CI)`,"apiConfig.tokens.empty":`Aún no hay tokens.`,"apiConfig.tokens.errorName":`El nombre es obligatorio`,"apiConfig.tokens.errorCreate":`No se pudo crear el token`,"apiConfig.tokens.col.name":`Nombre`,"apiConfig.tokens.col.status":`Estado`,"apiConfig.tokens.col.created":`Creado`,"apiConfig.tokens.status.active":`Activo`,"apiConfig.tokens.status.revoked":`Revocado`,"apiConfig.tokens.dialog.title":`¿Revocar este token de API?`,"apiConfig.tokens.dialog.message":`Cualquier aplicación que use este token perderá el acceso de inmediato.`,_section_settings:`── Ajustes ───────────────────────────────────────`,"settings.title":`Ajustes`,"settings.account.heading":`Cuenta`,"settings.account.email":`Correo electrónico:`,"settings.account.roles":`Roles:`,"settings.account.id":`ID:`,"settings.account.changePassword":`Cambiar contraseña`,"settings.export.heading":`Exportar datos`,"settings.export.hint":`Descarga todos los registros de consentimiento o los registros de auditoría.`,"settings.export.consentCsv":`Consentimientos CSV`,"settings.export.consentXlsx":`Consentimientos XLSX`,"settings.export.consentJson":`Consentimientos JSON`,"settings.export.auditCsv":`Auditoría CSV`,"settings.about.heading":`Acerca de`,"settings.about.text":`Consenti v0.1.0 — Plataforma de gestión de consentimientos de código abierto y compatible con RGPD.`,"settings.about.license":`Licencia Apache 2.0.`,_section_changePassword:`── Cambiar contraseña ───────────────────────────`,"changePassword.title":`Cambiar contraseña`,"changePassword.hint":`Elige una contraseña segura de al menos 12 caracteres.`,"changePassword.success":`Contraseña actualizada correctamente.`,"changePassword.newPassword":`Nueva contraseña`,"changePassword.newPasswordPlaceholder":`Mín. 12 caracteres`,"changePassword.confirmPassword":`Confirmar nueva contraseña`,"changePassword.confirmPasswordPlaceholder":`Repite la nueva contraseña`,"changePassword.submit":`Actualizar contraseña`,"changePassword.submitting":`Guardando…`,"changePassword.error.minLength":`La contraseña debe tener al menos 12 caracteres.`,"changePassword.error.mismatch":`Las contraseñas no coinciden.`,"changePassword.error.failed":`No se pudo actualizar la contraseña.`,"login.showPassword":`Show password`,"login.hidePassword":`Hide password`,"users.allowedSites":`Allowed Sites`,"users.allowedSitesHint":`(leave empty to allow all)`,"users.edit.title":`Edit User: {{name}}`,"users.edit.error.save":`Failed to save changes.`,"profileEditor.import.imported":`Imported {{n}} locales: {{list}}`,"profileEditor.import.importedSingular":`Imported 1 locale: {{list}}`,"profileEditor.import.skipped":`Skipped {{n}} unrecognised locale keys: {{list}}`,"profileEditor.import.skippedSingular":`Skipped 1 unrecognised locale key: {{list}}`,"profileEditor.config.selectDefaultLocale":`Select default locale…`,"profileEditor.config.complianceGroup":`Compliance Group`,"profileEditor.config.complianceGroupNone":`None / Custom`,"profileEditor.config.gpcMode":`GPC Signal Mode`,"profileEditor.config.gpcModeDefault":`Default (inherit from compliance group)`,"profileEditor.config.gpcModePlaceholder":`Default`,"profileEditor.config.hidePoweredBy":`Hide "Powered by Consenti"`,"profileEditor.config.hidePoweredByHint":`Remove the branding link from the consent banner.`,"profileEditor.config.allowReceipt":`Allow consent receipt`,"profileEditor.config.allowReceiptHint":`Let visitors download a PDF receipt of their consent choices.`,"profileEditor.conflict.title":`Active profile conflict`,"profileEditor.conflict.message":`Profile "{{name}}" is already active for this compliance group. Only one profile can be active per group.`,"profileEditor.conflict.deactivate":`Deactivate "{{name}}" and activate this one`,"profileEditor.conflict.saveInactive":`Save this profile as inactive`,"profileEditor.compliance.errors.heading":`Compliance errors — fix before continuing:`,"profileEditor.compliance.warnings.heading":`Compliance warnings:`,"profileEditor.compliance.warnings.acknowledge":`I acknowledge these warnings and wish to continue`,"profileEditor.content.selectLocale":`Select locale…`,"profileEditor.content.addLocale":`+ Add locale`,"profileEditor.content.defaultLocaleLabel":`(default)`,_section_readability:`── Readability Warnings ─────────────────────────`,"readability.headingTooLong":`Heading is {{n}} characters — keep it under 80 for readability.`,"readability.avgSentenceLong":`Average sentence length is {{n}} words — aim for 25 or fewer.`,"readability.totalWordsLong":`Text is {{n}} words long — consider keeping banner copy under 150 words.`,"cookieTemplates.editor.gpcMandatoryTitle":`Mandatory cookies are never auto-denied by GPC`,"cookieTemplates.editor.loadDefaultsBtn":`Click here to load default cookies list`,"cookieTemplates.editor.confirmUpdate.title":`Update template used by {{n}} profiles?`,"cookieTemplates.editor.confirmUpdate.titleSingular":`Update template used by 1 profile?`,"cookieTemplates.editor.confirmUpdate.message":`Profiles: {{names}}.
2
-
3
- Saving will update cookie definitions for all profiles using this template. Continue?`,"cookieTemplates.editor.legalBasis.mandatoryUsage":`Mandatory (Strictly Necessary): The cookie is always granted — the visitor cannot turn it off. Use only for cookies genuinely required for the site to function (session tokens, CSRF, load balancing).`,"cookieTemplates.editor.legalBasis.mandatoryLawName":`ePrivacy Dir. Recital 25`,"cookieTemplates.editor.legalBasis.mandatoryLawText":`"Strictly necessary" cookies are exempt from consent. Do not mark analytics or advertising cookies as Mandatory.`,"cookieTemplates.editor.legalBasis.examples":`Consent: analytics_storage · ad_storage · Legitimate Interest: server-side analytics · Mandatory: session · csrf_token · load_balancer_id`,"uiTemplates.editor.loadDefaultsPrompt":`Start from scratch, or load a sensible default structure (buttons, categories, positions).`,"uiTemplates.editor.loadDefaultsBtn":`Load Defaults`,"uiTemplates.editor.confirmUpdate.title":`Update template used by {{n}} profiles?`,"uiTemplates.editor.confirmUpdate.titleSingular":`Update template used by 1 profile?`,"uiTemplates.editor.confirmUpdate.message":`Profiles: {{names}}.
4
-
5
- Saving will apply UI changes to all profiles using this template. Continue?`,"uiTemplates.editor.wizard.stepOf":`Paso {{step}} de {{total}}`,"uiTemplates.editor.wizard.next":`Siguiente`,"uiTemplates.editor.wizard.back":`Atrás`,_section_howItWorks:`── Cómo funciona Consenti ────────────────────────────`,"nav.howItWorks":`Cómo funciona Consenti`,"howItWorks.title":`Cómo funciona Consenti`,"howItWorks.intro":`Consenti es una plataforma de gestión de consentimiento de código abierto y cumplimiento con el RGPD. Gestiona la recopilación, almacenamiento e informes de consentimiento de cookies para sus sitios web. Esta guía le explica el flujo de trabajo principal y describe cada sección del panel.`,"howItWorks.workflow.heading":`Flujo de trabajo principal`,"howItWorks.workflow.step1.title":`Definir categorías de cookies`,"howItWorks.workflow.step1.desc":`Vaya a Banners de consentimiento → Plantillas de cookies y cree una plantilla con todas las categorías de cookies de su sitio (p. ej., análisis, marketing). Establezca la base legal y la caducidad de cada categoría.`,"howItWorks.workflow.step2.title":`Diseñar la interfaz de consentimiento`,"howItWorks.workflow.step2.desc":`Vaya a Banners de consentimiento → Plantillas de UI y configure el diseño visual de su banner y modal de preferencias — etiquetas de botones, colores, estilo de diseño y visualización de categorías.`,"howItWorks.workflow.step3.title":`Crear un perfil de consentimiento`,"howItWorks.workflow.step3.desc":`Vaya a Banners de consentimiento → Perfiles y combine una Plantilla de cookies con una Plantilla de UI. Añada texto traducido para cada idioma, habilite las normativas necesarias (RGPD, CCPA, DPDPA) y publique.`,"howItWorks.workflow.step4.title":`Integrar el widget`,"howItWorks.workflow.step4.desc":`Copie su clave de API desde API → Configuración y añada la etiqueta de script de Consenti a su sitio web. El widget obtiene su perfil publicado y muestra el banner de consentimiento automáticamente.`,"howItWorks.workflow.step5.title":`Monitorear y auditar`,"howItWorks.workflow.step5.desc":`Use las páginas Consentimientos y Visitantes para revisar registros de consentimiento en tiempo real. Use el Registro de auditoría para un historial inalterable de todas las acciones administrativas como evidencia de cumplimiento.`,"howItWorks.features.heading":`Funcionalidades del panel`,"howItWorks.features.dashboard.title":`Panel`,"howItWorks.features.dashboard.desc":`La pantalla principal muestra KPIs en tiempo real — total de consentimientos, tasa de aceptación, tasa de rechazo y un gráfico de series temporales. Úselo para detectar tendencias y evaluar el impacto de los cambios en el banner.`,"howItWorks.features.cookieTemplates.title":`Plantillas de cookies`,"howItWorks.features.cookieTemplates.desc":`Listas reutilizables de categorías de cookies. Cada categoría tiene un ID, base legal (consentimiento, interés legítimo, necesario), gestión de señal GPC, caducidad y mapeo opcional de proveedor TCF o categoría CPRA.`,"howItWorks.features.uiTemplates.title":`Plantillas de UI`,"howItWorks.features.uiTemplates.desc":`Controla la apariencia del banner de consentimiento, el aviso GPC y el modal de preferencias. Configure conjuntos de botones, etiquetas de encabezado, opacidad de superposición y orden de visualización de categorías.`,"howItWorks.features.profiles.title":`Perfiles`,"howItWorks.features.profiles.desc":`Un perfil es la unidad desplegable. Vincula una Plantilla de cookies con una Plantilla de UI, almacena contenido multilingüe y sigue un número de versión para retroceder. Solo un perfil por dominio puede estar activo a la vez.`,"howItWorks.features.consents.title":`Consentimientos`,"howItWorks.features.consents.desc":`Un registro buscable y filtrable de todos los registros de consentimiento enviados por los visitantes. Cada registro muestra el ID de visitante, perfil utilizado, idioma, señal GPC, decisiones de consentimiento y marca de tiempo.`,"howItWorks.features.visitors.title":`Visitantes`,"howItWorks.features.visitors.desc":`Una lista de identificadores de visitantes únicos en sus sitios, con su país, fecha de primer acceso y fecha de último acceso. Los IDs de visitante son UUID seudónimos almacenados sin direcciones IP.`,"howItWorks.features.users.title":`Usuarios`,"howItWorks.features.users.desc":`Gestione las cuentas de administrador que pueden iniciar sesión en este panel. Asigne roles, active o desactive cuentas y restrinja usuarios a sitios específicos en implementaciones multitenant.`,"howItWorks.features.roles.title":`Roles`,"howItWorks.features.roles.desc":`Defina conjuntos de permisos con nombre (p. ej., Visor, Editor, Administrador). Asigne permisos granulares como consent:view, profile:edit o audit:view a cada rol y luego asigne roles a los usuarios.`,"howItWorks.features.vendors.title":`Proveedores`,"howItWorks.features.vendors.desc":`Explore la Lista Global de Proveedores (GVL) de IAB para buscar IDs de proveedores TCF, propósitos declarados y propósitos de interés legítimo. Use estos IDs al configurar categorías de cookies en sus plantillas.`,"howItWorks.features.audit.title":`Registro de auditoría`,"howItWorks.features.audit.desc":`Un registro de solo adición e inalterable de cada acción administrativa — guardados de perfiles, cambios de usuarios, creación de claves de API y más. Necesario para las obligaciones de responsabilidad del RGPD.`,"howItWorks.features.api.title":`API y claves`,"howItWorks.features.api.desc":`Genere y revoque tokens de API, configure orígenes CORS permitidos para la API pública de consentimiento y explore la referencia interactiva de OpenAPI para entender cada endpoint.`,"howItWorks.features.settings.title":`Configuración`,"howItWorks.features.settings.desc":`Vea los detalles de su cuenta, cambie su contraseña y exporte datos de consentimiento o auditoría como CSV, XLSX o JSON para análisis sin conexión o presentaciones regulatorias.`,"howItWorks.docs.heading":`Documentación completa`,"howItWorks.docs.text":`Guías detalladas, referencias de configuración, ejemplos de integración y un playground en vivo están disponibles en el sitio de documentación de Consenti.`,"howItWorks.docs.link":`Abrir consenti.dev/docs →`,"howItWorks.consentFlow.heading":`Flujo de consentimiento extremo a extremo`,"howItWorks.consentFlow.step1.title":`Widget inicializado`,"howItWorks.consentFlow.step1.desc":`El script de Consenti se carga en el navegador del visitante y lee su configuración (clave API, compliance.type). Si ya existe una cookie de consentimiento válida y no expirada, el widget se cierra silenciosamente — no se muestra ningún banner.`,"howItWorks.consentFlow.step2.title":`Jurisdicción detectada`,"howItWorks.consentFlow.step2.desc":`Si compliance.type es 'auto', el widget llama a GET /resolve-profile enviando la zona horaria, el encabezado Accept-Language y la dirección IP del visitante. El servidor asigna estas señales a un complianceGroup mediante el mapa de país → conformidad integrado.`,"howItWorks.consentFlow.step3.title":`Perfil obtenido`,"howItWorks.consentFlow.step3.desc":`El widget obtiene el perfil activo para el complianceGroup resuelto y el idioma del visitante. La respuesta es un objeto JSON plano con todo el texto del banner, las categorías de cookies, los ajustes de la interfaz y los indicadores de regulación — listo para renderizar.`,"howItWorks.consentFlow.step4.title":`Banner renderizado`,"howItWorks.consentFlow.step4.desc":`El widget renderiza el banner o el modal de preferencias usando la plantilla UI del perfil. Las categorías obligatorias están marcadas previamente y no pueden desmarcarse. Las categorías opcionales muestran su base legal (consentimiento o interés legítimo).`,"howItWorks.consentFlow.step5.title":`Consentimiento enviado`,"howItWorks.consentFlow.step5.desc":`Cuando el visitante actúa (Aceptar todo, Rechazar todo o Guardar preferencias), el widget envía un POST a la API con el registro de consentimiento: ID de visitante, versión del perfil, estado por categoría (otorgado/denegado/objetado), señal GPC, marca de tiempo e idioma.`,"howItWorks.consentFlow.step6.title":`Almacenado y auditado`,"howItWorks.consentFlow.step6.desc":`La API valida la carga útil, almacena el registro de consentimiento y añade una entrada al registro de auditoría de solo anexión. El registro del visitante se actualiza con el país y las fechas de primera/última visita. El widget escribe la cookie de consentimiento para que visitas futuras omitan el banner.`,"howItWorks.profileResolution.heading":`Algoritmo de resolución de perfil`,"howItWorks.profileResolution.intro":`Cuando llega un visitante, Consenti resuelve en cinco pasos qué perfil de consentimiento mostrar.`,"howItWorks.profileResolution.step1.title":`Señales geográficas recopiladas`,"howItWorks.profileResolution.step1.desc":`El widget envía tres señales a GET /resolve-profile: la zona horaria del navegador (Intl.DateTimeFormat), el encabezado Accept-Language (o parámetro lang), y la dirección IP del lado del servidor.`,"howItWorks.profileResolution.step2.title":`País determinado`,"howItWorks.profileResolution.step2.desc":`El servidor intenta en orden: (1) geolocalización por IP a través del geoDataProvider configurado; (2) tabla de zona horaria → país; (3) heurística de etiqueta de idioma → país (p. ej. 'es' → ES). El primer resultado no vacío prevalece.`,"howItWorks.profileResolution.step3.title":`Grupo de cumplimiento asignado`,"howItWorks.profileResolution.step3.desc":`El código de país ISO-3166-1 alfa-2 (más el código de región/estado opcional) se busca en el mapa integrado PAÍS → GRUPO_DE_CUMPLIMIENTO. Una anulación regional (p. ej. US/CA → optOutCalifornia) tiene prioridad sobre el valor predeterminado del país.`,"howItWorks.profileResolution.step4.title":`Perfil activo localizado`,"howItWorks.profileResolution.step4.desc":`El sistema consulta la base de datos para encontrar el perfil activo cuyo complianceGroup coincida con el grupo resuelto. Solo un perfil por complianceGroup puede estar activo a la vez. Si no existe ninguno, se devuelve 404 y el widget puede usar un profileOverride.`,"howItWorks.profileResolution.step5.title":`Idioma resuelto`,"howItWorks.profileResolution.step5.desc":`El mejor idioma se elige mediante: (1) coincidencia exacta con el idioma solicitado por el widget; (2) coincidencia por prefijo de idioma (p. ej. 'es-AR' → 'es'); (3) idioma resuelto por el proveedor; (4) defaultLocale del perfil. El JSON resuelto se sirve desde un archivo estático (perfiles publicados) o directamente desde la base de datos (vistas previas).`,"howItWorks.complianceGroups.heading":`Grupos de cumplimiento`,"howItWorks.complianceGroups.intro":`Cada país del mundo se asigna a uno de ocho grupos de cumplimiento. Cada grupo determina el modelo de consentimiento que debe seguir el widget.`,"howItWorks.complianceGroups.optIn.title":`optIn — GDPR / ePrivacy Opt-In estricto`,"howItWorks.complianceGroups.optIn.desc":`Se requiere consentimiento previo antes de establecer cookies no esenciales. Los visitantes deben tener la opción genuina de rechazar, la retirada debe ser tan fácil como dar el consentimiento, y se deben ofrecer opciones granulares por categoría.`,"howItWorks.complianceGroups.optIn.laws":`GDPR, Directiva ePrivacy, UK GDPR, PECR, revFADP (CH), KVKK (TR), PDPA (TH) y otras leyes nacionales estrictas`,"howItWorks.complianceGroups.optIn.countries":`Todos los estados miembros de la UE, Reino Unido, Suiza, Turquía, Tailandia, Islandia, Liechtenstein, Noruega, Guernsey, Gibraltar y otros países con normas ePrivacy estrictas`,"howItWorks.complianceGroups.optInDPDPA.title":`optInDPDPA — India DPDPA`,"howItWorks.complianceGroups.optInDPDPA.desc":`La Ley de Protección de Datos Personales Digitales de India 2023 requiere consentimiento explícito opt-in. Obligaciones adicionales: nombrar un Data Fiduciary, proporcionar un aviso de consentimiento dedicado y respaldar los derechos de los Data Principals. Establezca el campo dpdpaDataFiduciary en su perfil.`,"howItWorks.complianceGroups.optInDPDPA.laws":`Ley de Protección de Datos Personales Digitales 2023 (DPDPA)`,"howItWorks.complianceGroups.optInDPDPA.countries":`India (IN)`,"howItWorks.complianceGroups.optInChina.title":`optInChina — Marco legal múltiple de China`,"howItWorks.complianceGroups.optInChina.desc":`La gobernanza de datos de China requiere consentimiento explícito bajo la PIPL, combinado con obligaciones de la Ley de Seguridad de Datos (DSL) y la Ley de Ciberseguridad (CSL). Requisitos adicionales aplican a transferencias transfronterizas de datos y clasificación de datos.`,"howItWorks.complianceGroups.optInChina.laws":`Ley de Protección de Información Personal (PIPL), Ley de Seguridad de Datos (DSL), Ley de Ciberseguridad (CSL)`,"howItWorks.complianceGroups.optInChina.countries":`China (CN)`,"howItWorks.complianceGroups.optOutCalifornia.title":`optOutCalifornia — California CCPA / CPRA`,"howItWorks.complianceGroups.optOutCalifornia.desc":`Los datos pueden recopilarse por defecto, pero los consumidores deben tener una opción clara de opt-out de la venta o compartición de sus datos personales. La señal GPC (Global Privacy Control) debe respetarse como un opt-out válido.`,"howItWorks.complianceGroups.optOutCalifornia.laws":`CCPA, CPRA (California Consumer Privacy Act / California Privacy Rights Act)`,"howItWorks.complianceGroups.optOutCalifornia.countries":`Estados Unidos — California (US/CA)`,"howItWorks.complianceGroups.optOutUSState.title":`optOutUSState — Otros estados de EE. UU.`,"howItWorks.complianceGroups.optOutUSState.desc":`Modelado según el marco de opt-out de California. Los consumidores pueden optar por no participar en publicidad dirigida y la venta de datos personales. Varios estados exigen respetar la señal GPC.`,"howItWorks.complianceGroups.optOutUSState.laws":`CDPA (VA), CPA (CO), CTDPA (CT), UCPA (UT), TDPSA (TX), DPDPA (DE), NJDPA (NJ), OCPA (OR), MCDPA (MN), MODPA (MD), KCDPA (KY), TIPA (TN), NDPA (NE), ICDPA (IA/IN), MCDPA (MT), NHPA (NH), RIDTPA (RI)`,"howItWorks.complianceGroups.optOutUSState.countries":`Estados Unidos — VA, CO, CT, UT, TX, DE, NJ, OR, MN, MD, KY, TN, NE, IA, IN, MT, NH, RI`,"howItWorks.complianceGroups.generalPrivacyConsent.title":`generalPrivacyConsent — Privacidad general / Consentimiento`,"howItWorks.complianceGroups.generalPrivacyConsent.desc":`Existe una ley general de privacidad pero no impone un requisito estricto de banner de cookies al estilo PECR/ePrivacy. La mejor práctica es ofrecer una opción de consentimiento para cookies no esenciales y un aviso de privacidad claro, pero el umbral legal es inferior al opt-in del GDPR.`,"howItWorks.complianceGroups.generalPrivacyConsent.laws":`PIPEDA / Ley 25 (CA), LGPD (BR — usar hybridBrazil), POPIA (ZA), APPI (JP), Privacy Act (AU/NZ), PDPA-SG, PDPA-MY, PIPA-KR, PDPD-VN, DPA-PH, PDP-ID y muchos otros`,"howItWorks.complianceGroups.generalPrivacyConsent.countries":`Canadá, Australia, Nueva Zelanda, Japón, Corea del Sur, Singapur, Malasia, Sudáfrica y muchos países de América Latina, África y Asia`,"howItWorks.complianceGroups.hybridBrazil.title":`hybridBrazil — Brasil LGPD`,"howItWorks.complianceGroups.hybridBrazil.desc":`La LGPD de Brasil es similar al GDPR pero las cookies de analítica y publicidad pueden tratarse bajo la base legal de interés legítimo según la evaluación del responsable del tratamiento. Se muestra el banner, pero la base legal por categoría puede ser más matizada que el opt-in estricto del GDPR.`,"howItWorks.complianceGroups.hybridBrazil.laws":`Lei Geral de Proteção de Dados (LGPD)`,"howItWorks.complianceGroups.hybridBrazil.countries":`Brasil (BR)`,"howItWorks.complianceGroups.noticeOnly.title":`noticeOnly — Solo aviso de privacidad`,"howItWorks.complianceGroups.noticeOnly.desc":`No aplica ninguna regulación específica de cookies, o el régimen existente solo requiere un aviso de privacidad — no un banner obligatorio de opt-in u opt-out. Mostrar un banner de consentimiento sigue siendo recomendable para la transparencia, pero no está legalmente obligado.`,"howItWorks.complianceGroups.noticeOnly.laws":`Variable — países sin regulación dedicada de cookies / ePrivacy`,"howItWorks.complianceGroups.noticeOnly.countries":`Muchos países de África, Asia Central, el Caribe y el Pacífico no cubiertos por los grupos anteriores`,"howItWorks.enums.heading":`Referencia de valores clave`,"howItWorks.enums.legalBasis.heading":`legalBasis (categoría de cookie)`,"howItWorks.enums.legalBasis.mandatory":`mandatory — La categoría está siempre activa independientemente del consentimiento (p. ej. sesión, autenticación). Nunca bloqueada por GPC o señales de opt-out.`,"howItWorks.enums.legalBasis.consent":`consent — Requiere opt-in explícito del visitante. Bloqueado por defecto; bloqueado por GPC en todas las jurisdicciones opt-in.`,"howItWorks.enums.legalBasis.legitimateInterest":`legitimate_interest — Se basa en el interés legítimo del responsable. Activo por defecto; el visitante puede objetar. Soft-bloqueado por GPC en algunas jurisdicciones (UE, Reino Unido).`,"howItWorks.enums.consentStatus.heading":`ConsentStatus (por registro de categoría)`,"howItWorks.enums.consentStatus.granted":`granted — El visitante dio consentimiento explícito para esta categoría.`,"howItWorks.enums.consentStatus.denied":`denied — El visitante rechazó explícitamente el consentimiento para esta categoría.`,"howItWorks.enums.consentStatus.objected":`objected — El visitante objetó a una categoría de interés legítimo (opt-out, no un rechazo de consentimiento).`,"howItWorks.enums.geoProvider.heading":`Opciones de geoDataProvider`,"howItWorks.enums.geoProvider.default":`default / timezone — Usa la zona horaria del navegador (Intl.DateTimeFormat) para inferir el país, con respaldo en Accept-Language. Sin dependencia adicional.`,"howItWorks.enums.geoProvider.language":`language — Deriva el país solo del encabezado Accept-Language (p. ej. 'es' → ES, 'pt' → BR). Rápido pero impreciso.`,"howItWorks.enums.geoProvider.geoip":`geoip — Usa el paquete npm geoip-lite con una base de datos MaxMind Lite integrada. Requerido: npm install geoip-lite.`,"howItWorks.enums.geoProvider.hostedGeoipLite":`hosted-geoip-lite — Llama a ipinfo.io mediante HTTPS integrado (sin dependencia extra). Añade ~50–200 ms por primera visita.`,"howItWorks.enums.geoProvider.maxmind":`maxmind — Usa el paquete npm maxmind con un archivo local GeoLite2-City.mmdb. El más preciso. Requiere la variable de entorno MAXMIND_DB_PATH y npm install maxmind.`,"howItWorks.enums.geoProvider.custom":`Función personalizada — Pase una CountryResolverFn a compliance.geoDataProvider para integrar cualquier proveedor de geo-IP o CDN.`};export{e as default};
@@ -1,5 +0,0 @@
1
- var e={_section_nav:`── Navigation ──────────────────────────────────────────`,"nav.dashboard":`Tableau de bord`,"nav.consentBanners":`Bannières de consentement`,"nav.cookieTemplates":`Modèles de cookies`,"nav.uiTemplates":`Modèles d'interface`,"nav.profiles":`Profils`,"nav.consents":`Consentements`,"nav.visitors":`Visiteurs`,"nav.users":`Utilisateurs`,"nav.roles":`Rôles`,"nav.sites":`Sites`,"nav.vendors":`Fournisseurs TCF`,"nav.audit":`Journal d'audit`,"nav.api":`API`,"nav.apiConfig":`Configuration`,"nav.apiDocs":`Documentation des endpoints`,"nav.settings":`Paramètres`,"nav.adminDashboard":`Tableau admin`,_section_layout:`── Mise en page ────────────────────────────────────`,"layout.expandSidebar":`Développer la barre latérale`,"layout.collapseSidebar":`Réduire la barre latérale`,"layout.signOut":`Se déconnecter`,"layout.toggleDark":`Passer en mode sombre`,"layout.toggleLight":`Passer en mode clair`,"layout.poweredBy":`Propulsé par`,_section_common:`── Général ────────────────────────────────────────`,"common.loading":`Chargement…`,"common.save":`Enregistrer`,"common.saving":`Enregistrement…`,"common.cancel":`Annuler`,"common.close":`Fermer`,"common.delete":`Supprimer`,"common.edit":`Modifier`,"common.create":`Créer`,"common.confirm":`Confirmer`,"common.noData":`Aucune donnée`,"common.exportCsv":`Exporter CSV`,"common.duplicate":`Dupliquer`,"common.active":`Actif`,"common.inactive":`Inactif`,"common.name":`Nom`,"common.email":`E-mail`,"common.status":`Statut`,"common.created":`Créé`,"common.id":`ID`,"common.add":`Ajouter`,"common.remove":`Retirer`,"common.revoke":`Révoquer`,"common.required":`Obligatoire`,"common.version":`Version`,"common.locale":`Langue`,"common.country":`Pays`,"common.source":`Source`,"common.grantAll":`Tout autoriser`,"common.revokeAll":`Tout révoquer`,"common.granted":`accordé`,"common.page":`Page {{n}}`,"common.prev":`Préc`,"common.next":`Suiv`,"common.you":`Vous`,"common.default":`par défaut`,"common.hide":`Masquer`,"common.show":`Afficher`,"common.activate":`Activer`,"common.deactivate":`Désactiver`,"common.newRole":`Nouveau rôle`,"common.copyToClipboard":`Copier dans le presse-papiers`,"common.back":`Retour`,"common.copyId":`Copier l'ID`,"common.mandatory":`obligatoire`,"common.optional":`Optionnel`,"common.roles":`Rôles`,"common.showPassword":`Afficher le mot de passe`,"common.hidePassword":`Masquer le mot de passe`,"common.updated":`Mis à jour`,_section_locale:`── Sélecteur de langue ─────────────────────────────`,"locale.en":`Anglais`,"locale.switcherAria":`Changer de langue`,_section_login:`── Connexion ───────────────────────────────────────`,"login.title":`{{appName}} Admin`,"login.subtitle":`Connectez-vous à votre compte`,"login.email":`E-mail`,"login.emailPlaceholder":`admin@example.com`,"login.password":`Mot de passe`,"login.submit":`Se connecter`,"login.submitting":`Connexion…`,"login.error.invalid":`E-mail ou mot de passe invalide`,"login.devSignIn":`⚡ Dev : se connecter en tant que user@consenti.dev`,_section_dashboard:`── Tableau de bord ───────────────────────────────`,"dashboard.title":`Tableau de bord`,"dashboard.stats.totalConsents":`Total des consentements`,"dashboard.stats.totalVisitors":`Total des visiteurs`,"dashboard.stats.accepted":`Acceptés`,"dashboard.stats.acceptedSub":`≥80% des cookies accordés`,"dashboard.stats.rejected":`Refusés`,"dashboard.stats.rejectedSub":`≤20% des cookies accordés`,"dashboard.chart.timeline":`Consentements (30 derniers jours)`,"dashboard.chart.timelineAria":`Graphique du timeline des consentements`,"dashboard.chart.countries":`Pays principaux`,"dashboard.chart.noData":`Aucune donnée.`,"dashboard.chart.noCountryData":`Aucune donnée par pays.`,"dashboard.gpc.label":`Taux de détection GPC`,"dashboard.gpc.sub":`{{detected}} sur {{total}} consentements`,_section_consents:`── Consentements ─────────────────────────────────`,"consents.title":`Enregistrements de consentement`,"consents.filterFrom":`De`,"consents.filterTo":`À`,"consents.filterGpc":`GPC uniquement`,"consents.records":`{{n}} enregistrements`,"consents.empty":`Aucun enregistrement de consentement pour le moment.`,"consents.col.visitorId":`ID visiteur`,"consents.col.profile":`Profil`,"consents.col.locale":`Langue`,"consents.col.gpc":`GPC`,"consents.col.age":`Âge`,"consents.col.source":`Source`,"consents.col.created":`Créé`,"consents.gpcYes":`Oui`,"consents.ageVerified":`Vérifié`,_section_visitors:`── Visiteurs ─────────────────────────────────────`,"visitors.title":`Visiteurs`,"visitors.empty":`Aucun visiteur enregistré pour le moment.`,"visitors.col.visitorId":`ID visiteur`,"visitors.col.country":`Pays`,"visitors.col.firstSeen":`Vu pour la première fois`,"visitors.col.lastSeen":`Dernière visite`,_section_users:`── Utilisateurs ─────────────────────────────────`,"users.title":`Utilisateurs`,"users.count":`{{n}} utilisateurs`,"users.newUser":`+ Nouvel utilisateur`,"users.createForm.title":`Créer un utilisateur`,"users.createForm.namePlaceholder":`Nom`,"users.createForm.emailPlaceholder":`E-mail`,"users.createForm.passwordPlaceholder":`Mot de passe`,"users.createForm.confirmPasswordPlaceholder":`Confirmer le mot de passe`,"users.createForm.selectRole":`Sélectionner un rôle…`,"users.createForm.passwordMismatch":`Les mots de passe ne correspondent pas`,"users.createForm.error":`Échec de la création de l'utilisateur`,"users.col.status":`Statut`,"users.status.active":`Actif`,"users.status.inactive":`Inactif`,"users.action.activate":`Activer`,"users.action.deactivate":`Désactiver`,"users.dialog.delete.title":`Supprimer l'utilisateur « {{name}} » ?`,"users.dialog.delete.message":`Ce compte utilisateur sera définitivement supprimé.`,_section_roles:`── Rôles & Permissions ───────────────────────────`,"roles.title":`Rôles & Permissions`,"roles.list.heading":`Rôles`,"roles.list.empty":`Aucun rôle pour le moment. Créez-en un pour commencer.`,"roles.form.roleNameLabel":`Nom du rôle`,"roles.form.roleNamePlaceholder":`ex. Éditeur`,"roles.form.descriptionLabel":`Description`,"roles.form.descriptionPlaceholder":`Description optionnelle`,"roles.perms.heading":`Permissions — {{name}}`,"roles.perms.selectPrompt":`Sélectionnez un rôle pour gérer les permissions`,"roles.perms.clickPrompt":`Cliquez sur un rôle à gauche pour voir et gérer ses permissions.`,"roles.perms.noPerms":`Aucune permission définie dans le système.`,"roles.error.load":`Impossible de charger les rôles.`,"roles.error.create":`Échec de la création du rôle.`,"roles.error.update":`Échec de la mise à jour du rôle.`,"roles.error.delete":`Échec de la suppression du rôle.`,"roles.error.perm":`Échec de la mise à jour de la permission.`,"roles.dialog.delete.title":`Supprimer le rôle « {{name}} » ?`,"roles.dialog.delete.message":`Les utilisateurs affectés à ce rôle perdront immédiatement ses permissions.`,"roles.aria.editRole":`Modifier le rôle`,"roles.aria.deleteRole":`Supprimer le rôle`,_section_profiles:`── Profils ───────────────────────────────────────`,"profiles.title":`Profils`,"profiles.count":`{{n}} profils`,"profiles.countSingular":`{{n}} profil`,"profiles.newProfile":`+ Nouveau profil`,"profiles.empty":`Aucun profil pour le moment. Créez-en un pour commencer.`,"profiles.col.name":`Nom`,"profiles.col.defaultLocale":`Langue par défaut`,"profiles.col.version":`Version`,"profiles.col.templates":`Modèles`,"profiles.col.created":`Créé`,"profiles.template.cookie":`Cookie :`,"profiles.template.ui":`UI :`,"profiles.action.copyId":`Copier l'ID du profil`,"profiles.action.copying":`Copie…`,"profiles.dialog.delete.title":`Supprimer « {{name}} » ?`,"profiles.dialog.delete.message":`Ce profil et tout son contenu localisé seront définitivement supprimés.`,"profiles.dialog.copy.title":`Copier « {{name}} » ?`,"profiles.dialog.copy.message":`Ce profil et tout son contenu localisé seront dupliqués.`,_section_profileEditor:`── Éditeur de profil ─────────────────────────────`,"profileEditor.title.new":`Nouveau profil`,"profileEditor.title.edit":`Modifier le profil`,"profileEditor.title.loading":`Éditeur de profil`,"profileEditor.step.config":`Configuration du profil`,"profileEditor.step.templates":`Modèles`,"profileEditor.step.content":`Contenu`,"profileEditor.step.mainBanner":`Bannière principale`,"profileEditor.step.gpcBanner":`Bannière GPC`,"profileEditor.step.prefModal":`Modal préférences`,"profileEditor.config.profileName":`Nom du profil`,"profileEditor.config.profileNamePlaceholder":`Mon site web`,"profileEditor.config.defaultLocale":`Langue par défaut`,"profileEditor.config.allowedDomains":`Domaines autorisés`,"profileEditor.config.allowedDomainsHint":`Prend en charge les jokers (*.example.com). Laisser vide pour autoriser tous les domaines.`,"profileEditor.config.regulations":`Réglementations de conformité`,"profileEditor.config.reg.gdprLabel":`RGPD`,"profileEditor.config.reg.gdprDesc":`Opt-in UE/EEE. Aucun suivi tant que le consentement n'est pas donné. Bannière affichée à la première visite.`,"profileEditor.config.reg.ccpaLabel":`CCPA`,"profileEditor.config.reg.ccpaDesc":`Opt-out Californie. Les cookies sont accordés par défaut. Fournir un déclencheur "Do Not Sell".`,"profileEditor.config.reg.cpraLabel":`CPRA`,"profileEditor.config.reg.cpraDesc":`Californie 2023. Opt-out pour la vente/partage ; opt-in pour les données sensibles. GPC pris en compte.`,"profileEditor.config.reg.dpdpaLabel":`DPDPA`,"profileEditor.config.reg.dpdpaDesc":`Inde 2023. Opt-in comme le RGPD. GPC non reconnu. Avis du fiduciaire des données requis.`,"profileEditor.config.darkMode":`Activer le mode sombre`,"profileEditor.config.darkModeHint":`Applique des tokens de couleur sombre au widget de consentement pour les sites avec un thème sombre.`,"profileEditor.config.dpdpa.heading":`DPDPA — Champs obligatoires de l'avis de consentement`,"profileEditor.config.dpdpa.fiduciary":`Nom du fiduciaire des données`,"profileEditor.config.dpdpa.fiduciaryPlaceholder":`Acme Corp Pvt Ltd`,"profileEditor.config.dpdpa.grievanceEmail":`E-mail du responsable des réclamations`,"profileEditor.config.dpdpa.grievanceEmailPlaceholder":`grievance@acme.com`,"profileEditor.config.dpdpa.purpose":`Description de la finalité`,"profileEditor.config.dpdpa.purposePlaceholder":`Nous collectons vos données pour personnaliser votre expérience…`,"profileEditor.templates.cookieTemplate":`Modèle de cookie`,"profileEditor.templates.cookieTemplateHint":`Définit quels cookies/finalités apparaissent dans la fenêtre de préférences. Tous les champs proviennent du modèle — lecture seule dans le profil.`,"profileEditor.templates.selectCookie":`— Sélectionnez un modèle de cookie —`,"profileEditor.templates.uiTemplate":`Modèle UI`,"profileEditor.templates.uiTemplateHint":`Définit la disposition du bannière/modal, le nombre de boutons et la structure des catégories. Vous ajoutez le texte dans les étapes 3–5.`,"profileEditor.templates.selectUi":`— Sélectionnez un modèle UI —`,"profileEditor.templates.noTemplate":`Aucun modèle sélectionné.`,"profileEditor.templates.previewPrompt":`Sélectionnez à la fois un modèle de cookie et un modèle UI pour voir un aperçu en direct.`,"profileEditor.templates.categoriesCount":`catégories`,"profileEditor.templates.buttonsTotal":`boutons au total`,"profileEditor.content.loadDefaults":`Charger les valeurs par défaut`,"profileEditor.content.loadDefaultsTitle":`Remplir cette section avec des valeurs par défaut en anglais`,"profileEditor.content.loadDefaultsNotice":`Les valeurs par défaut sont en anglais uniquement — traduisez-les via l'onglet de langue ci-dessus.`,"profileEditor.content.importError":`Impossible d'analyser le fichier téléchargé. Assurez-vous qu'il correspond au format de modèle de langue Consenti.`,"profileEditor.content.mainBanner":`Bannière principale`,"profileEditor.content.gpcBanner":`Bannière GPC`,"profileEditor.content.prefModal":`Modal de préférences`,"profileEditor.content.heading":`Titre`,"profileEditor.content.subheading":`Sous-titre`,"profileEditor.content.bodyText":`Texte`,"profileEditor.content.introText":`Texte d'introduction (optionnel)`,"profileEditor.content.buttonLabels":`Libellés des boutons`,"profileEditor.content.categoryHeading":`Titre de la catégorie`,"profileEditor.content.categoryDesc":`Description de la catégorie`,"profileEditor.content.categoryFallback":`Catégorie {{n}}`,"profileEditor.content.categoryDescPlaceholder":`Description de cette catégorie de cookies…`,"profileEditor.content.mainBannerHeadingPlaceholder":`Nous accordons de l'importance à votre vie privée`,"profileEditor.content.mainBannerBodyPlaceholder":`Nous utilisons des cookies pour améliorer votre expérience…`,"profileEditor.content.gpcHeadingPlaceholder":`Contrôle de confidentialité global détecté`,"profileEditor.content.prefHeadingPlaceholder":`Préférences de confidentialité`,"profileEditor.content.prefSubheadingPlaceholder":`Gérez vos préférences de cookies ci-dessous.`,"profileEditor.content.prefIntroPlaceholder":`Introduction optionnelle au-dessus des catégories…`,"profileEditor.content.noContent":`Sélectionnez un modèle UI à l'étape 2 pour commencer à modifier le contenu.`,"profileEditor.content.loadingTemplate":`Chargement du modèle…`,"profileEditor.nav.nextTemplates":`Suivant : Modèles`,"profileEditor.nav.nextContent":`Suivant : Contenu`,"profileEditor.nav.nextMainBanner":`Suivant : Bannière principale`,"profileEditor.nav.nextGpcBanner":`Suivant : Bannière GPC`,"profileEditor.nav.nextPrefModal":`Suivant : Modal préférences`,"profileEditor.action.create":`Créer le profil`,"profileEditor.action.save":`Enregistrer le profil`,"profileEditor.error.nameRequired":`Le nom du profil est requis.`,"profileEditor.error.nameRequiredContinue":`Le nom du profil est requis avant de continuer.`,"profileEditor.error.cookieRequired":`Sélectionnez un modèle de cookie.`,"profileEditor.error.cookieContinue":`Sélectionnez un modèle de cookie pour continuer.`,"profileEditor.error.uiRequired":`Sélectionnez un modèle UI.`,"profileEditor.error.uiContinue":`Sélectionnez un modèle UI pour continuer.`,"profileEditor.error.failed":`Échec de l'enregistrement du profil.`,"profileEditor.error.load":`Échec du chargement du profil.`,"profileEditor.table.noNoCookies":`Aucun cookie défini dans ce modèle.`,"profileEditor.table.id":`ID`,"profileEditor.table.legalBasis":`Base légale`,"profileEditor.table.mandatory":`Obligatoire`,"profileEditor.table.gpc":`GPC`,"profileEditor.table.expiry":`Expiration`,"profileEditor.table.tcfVendor":`Fournisseur TCF`,"profileEditor.table.cpraCategory":`Catégorie CPRA`,"profileEditor.export.json":`JSON`,"profileEditor.export.csv":`CSV`,"profileEditor.export.import":`Importer`,"profileEditor.export.jsonTitle":`Télécharger le contenu localisé en JSON`,"profileEditor.export.csvTitle":`Télécharger le contenu localisé en CSV pour traduction`,"profileEditor.export.importTitle":`Téléverser JSON ou CSV traduit`,"profileEditor.newLink":`+ Nouveau ↗`,_section_cookieTemplates:`── Modèles de cookies ───────────────────────────`,"cookieTemplates.title":`Modèles de cookies`,"cookieTemplates.count":`{{n}} modèles`,"cookieTemplates.countSingular":`{{n}} modèle`,"cookieTemplates.new":`+ Nouveau modèle de cookie`,"cookieTemplates.empty.title":`Aucun modèle de cookie pour le moment.`,"cookieTemplates.empty.hint":`Les modèles de cookies définissent la liste des cookies/finalités pour vos profils de consentement. Créez-en un pour le réutiliser sur plusieurs profils.`,"cookieTemplates.required":`requis`,"cookieTemplates.dialog.delete.title":`Supprimer « {{name}} » ?`,"cookieTemplates.dialog.delete.message":`Ce modèle de cookie sera définitivement supprimé. Les profils liés perdront leurs définitions de cookies.`,"cookieTemplates.editor.title.new":`Nouveau modèle de cookie`,"cookieTemplates.editor.title.edit":`Modifier le modèle de cookie`,"cookieTemplates.editor.name":`Nom du modèle`,"cookieTemplates.editor.namePlaceholder":`ex. Google Analytics + Ads`,"cookieTemplates.editor.nameRequired":`Le nom du modèle est requis.`,"cookieTemplates.editor.definitions":`Définitions des cookies`,"cookieTemplates.editor.empty":`Aucun cookie défini pour le moment. Ajoutez-en un ci‑dessus.`,"cookieTemplates.editor.addCookie":`+ Ajouter un cookie`,"cookieTemplates.editor.error.allIds":`Tous les cookies doivent avoir un ID.`,"cookieTemplates.editor.error.uniqueIds":`Les IDs de cookie doivent être uniques.`,"cookieTemplates.editor.error.expiry":`L'expiration doit être d'au moins 1 jour.`,"cookieTemplates.editor.error.failed":`Échec de l'enregistrement du modèle.`,"cookieTemplates.editor.error.notFound":`Modèle introuvable.`,"cookieTemplates.editor.action.create":`Créer le modèle`,"cookieTemplates.editor.action.save":`Enregistrer le modèle`,"cookieTemplates.editor.showTcf":`Fournisseurs TCF`,"cookieTemplates.editor.showCpra":`Catégorie CPRA`,"cookieTemplates.editor.infoHint":`Cliquez sur un en-tête de colonne pour en savoir plus`,"cookieTemplates.editor.infoUsage":`Utilisation`,"cookieTemplates.editor.infoLaws":`Règles réglementaires`,"cookieTemplates.editor.infoExamples":`Exemples`,"cookieTemplates.col.id":`ID du cookie`,"cookieTemplates.col.idShort":`ID / Nom`,"cookieTemplates.col.legalBasis":`Base légale`,"cookieTemplates.col.mandatory":`Obligatoire (toujours accordé)`,"cookieTemplates.col.mandatoryShort":`Obligatoire`,"cookieTemplates.col.gpc":`Respecter le signal GPC`,"cookieTemplates.col.gpcShort":`GPC`,"cookieTemplates.col.expiry":`Intervalle de reconfirmation (jours)`,"cookieTemplates.col.expiryShort":`Expiration`,"cookieTemplates.col.tcfVendor":`IDs des fournisseurs TCF`,"cookieTemplates.col.cpraCategory":`Catégorie de données CPRA`,"cookieTemplates.col.tcfVendorShort":`Fournisseur TCF`,"cookieTemplates.col.cpraCategoryShort":`Catégorie CPRA`,_section_uiTemplates:`── Modèles d'interface ───────────────────────────`,"uiTemplates.title":`Modèles d'interface`,"uiTemplates.count":`{{n}} modèles`,"uiTemplates.countSingular":`{{n}} modèle`,"uiTemplates.new":`+ Nouveau modèle UI`,"uiTemplates.empty.title":`Aucun modèle UI pour le moment.`,"uiTemplates.empty.hint":`Les modèles UI définissent la configuration visuelle — positions, boutons, catégories — pour vos bannières et modals de consentement.`,"uiTemplates.mainBanner":`Bannière principale :`,"uiTemplates.gpcBanner":`Bannière GPC :`,"uiTemplates.modal":`Modalité :`,"uiTemplates.categories":`{{n}} catégories`,"uiTemplates.dialog.delete.title":`Supprimer « {{name}} » ?`,"uiTemplates.dialog.delete.message":`Ce modèle UI sera définitivement supprimé. Les profils liés perdront leurs paramètres UI.`,"uiTemplates.editor.title.new":`Nouveau modèle UI`,"uiTemplates.editor.title.edit":`Modifier le modèle UI`,"uiTemplates.editor.name":`Nom du modèle`,"uiTemplates.editor.nameRequired":`Le nom du modèle est requis.`,"uiTemplates.editor.namePlaceholder":`ex. Disposition GDPR standard`,"uiTemplates.editor.loading":`Chargement du modèle…`,"uiTemplates.editor.tabMain":`Bannière principale`,"uiTemplates.editor.tabGpc":`Bannière GPC`,"uiTemplates.editor.tabModal":`Modal de préférences`,"uiTemplates.editor.mainBannerHint":`Affichée à la première visite lorsqu'aucun consentement n'a été enregistré.`,"uiTemplates.editor.gpcBannerHint":`Affichée à la place de la bannière principale lorsqu'un signal GPC est détecté (autoHonorGPC activé).`,"uiTemplates.editor.error.notFound":`Modèle introuvable.`,"uiTemplates.editor.error.buttons":`Toutes les boutons doivent avoir un libellé.`,"uiTemplates.editor.error.customButtons":`Tous les boutons d'action « personnalisés » doivent avoir des cookies sélectionnés.`,"uiTemplates.editor.error.catIds":`Toutes les IDs de catégorie sont requises.`,"uiTemplates.editor.error.uniqueCatIds":`Les IDs de catégorie doivent être uniques.`,"uiTemplates.editor.error.catCookies":`Chaque catégorie doit inclure au moins un cookie.`,"uiTemplates.editor.error.failed":`Échec de l'enregistrement du modèle.`,"uiTemplates.editor.action.create":`Créer le modèle`,"uiTemplates.editor.action.save":`Enregistrer le modèle`,_section_sites:`── Sites / Tenants ───────────────────────────────`,"sites.title":`Sites / Tenants`,"sites.createNew":`Créer un site`,"sites.namePlaceholder":`Nom du site`,"sites.slugPlaceholder":`slug (ex. site-a)`,"sites.col.name":`Nom`,"sites.col.slug":`Slug`,"sites.col.id":`ID`,"sites.col.created":`Créé`,"sites.empty":`Aucun site pour le moment.`,"sites.dialog.delete.title":`Supprimer « {{name}} » ?`,"sites.dialog.delete.message":`Ce site et toutes les données associées seront définitivement supprimés. Cette action est irréversible.`,_section_vendors:`── Fournisseurs TCF ──────────────────────────────`,"vendors.title":`Liste des fournisseurs TCF`,"vendors.info.title":`Qu'est-ce que la liste des fournisseurs TCF ?`,"vendors.searchPlaceholder":`Rechercher des fournisseurs…`,"vendors.gvlMeta":`GVL v{{version}} · {{total}} fournisseurs`,"vendors.loading":`Chargement de la liste des fournisseurs…`,"vendors.noResults":`Aucun fournisseur trouvé.`,"vendors.col.id":`ID`,"vendors.col.name":`Nom`,"vendors.col.purposes":`Finalités`,"vendors.col.liPurposes":`Finalités LI`,"vendors.col.specialPurposes":`Finalités spéciales`,"vendors.pagination":`Page {{page}} sur {{totalPages}} · {{total}} fournisseurs au total`,"vendors.prev":`← Préc`,"vendors.next":`Suiv →`,_section_audit:`── Journal d'audit ────────────────────────────────`,"audit.title":`Journal d'audit`,"audit.empty":`Aucun événement d'audit pour le moment.`,"audit.col.time":`Heure`,"audit.col.action":`Action`,"audit.col.resource":`Ressource`,"audit.col.resourceId":`ID de la ressource`,"audit.col.actor":`Acteur`,"audit.actor.system":`système`,_section_apiConfig:`── Configuration API ─────────────────────────────`,"apiConfig.title":`Configuration API`,"apiConfig.origins.heading":`Origins autorisés`,"apiConfig.origins.hint":`Seules les requêtes provenant de ces origins recevront les données de consentement. Utilisez * pour autoriser tous les origins (non recommandé en production).`,"apiConfig.origins.placeholder":`https://example.com`,"apiConfig.origins.empty":`Aucun origin configuré — tous les origins sont actuellement autorisés.`,"apiConfig.origins.errorDuplicate":`Déjà dans la liste.`,"apiConfig.origins.errorSave":`Échec de l'enregistrement. Veuillez réessayer.`,"apiConfig.origins.remove":`Retirer`,"apiConfig.tokens.heading":`Tokens API admin`,"apiConfig.tokens.hint":`Tokens Bearer pour l'accès serveur et CI/CD à l'API admin Consenti. Passer en Authorization: Bearer <token>. Ne jamais exposer côté client — ces tokens donnent un accès admin complet.`,"apiConfig.tokens.created":`Token créé — copiez-le maintenant, il ne sera plus affiché.`,"apiConfig.tokens.placeholder":`Nom du token (ex. déploiement CI)`,"apiConfig.tokens.empty":`Aucun token pour le moment.`,"apiConfig.tokens.errorName":`Le nom est requis`,"apiConfig.tokens.errorCreate":`Échec de la création du token`,"apiConfig.tokens.col.name":`Nom`,"apiConfig.tokens.col.status":`Statut`,"apiConfig.tokens.col.created":`Créé`,"apiConfig.tokens.status.active":`Actif`,"apiConfig.tokens.status.revoked":`Révoqué`,"apiConfig.tokens.dialog.title":`Révoquer ce token API ?`,"apiConfig.tokens.dialog.message":`Toute application utilisant ce token perdra immédiatement l'accès.`,_section_settings:`── Paramètres ───────────────────────────────────`,"settings.title":`Paramètres`,"settings.account.heading":`Compte`,"settings.account.email":`E-mail :`,"settings.account.roles":`Rôles :`,"settings.account.id":`ID :`,"settings.account.changePassword":`Changer le mot de passe`,"settings.export.heading":`Exporter les données`,"settings.export.hint":`Télécharger tous les enregistrements de consentement ou les journaux d'audit.`,"settings.export.consentCsv":`Consentements CSV`,"settings.export.consentXlsx":`Consentements XLSX`,"settings.export.consentJson":`Consentements JSON`,"settings.export.auditCsv":`Audit CSV`,"settings.about.heading":`À propos`,"settings.about.text":`Consenti v0.1.0 — Plateforme open-source de gestion des consentements conforme au RGPD.`,"settings.about.license":`Licence Apache-2.0.`,_section_changePassword:`── Changer le mot de passe ────────────────────────`,"changePassword.title":`Changer le mot de passe`,"changePassword.hint":`Choisissez un mot de passe fort d'au moins 12 caractères.`,"changePassword.success":`Mot de passe mis à jour avec succès.`,"changePassword.newPassword":`Nouveau mot de passe`,"changePassword.newPasswordPlaceholder":`Min. 12 caractères`,"changePassword.confirmPassword":`Confirmer le nouveau mot de passe`,"changePassword.confirmPasswordPlaceholder":`Répétez le nouveau mot de passe`,"changePassword.submit":`Mettre à jour le mot de passe`,"changePassword.submitting":`Enregistrement…`,"changePassword.error.minLength":`Le mot de passe doit contenir au moins 12 caractères.`,"changePassword.error.mismatch":`Les mots de passe ne correspondent pas.`,"changePassword.error.failed":`Échec de la mise à jour du mot de passe.`,"login.showPassword":`Show password`,"login.hidePassword":`Hide password`,"users.allowedSites":`Allowed Sites`,"users.allowedSitesHint":`(leave empty to allow all)`,"users.edit.title":`Edit User: {{name}}`,"users.edit.error.save":`Failed to save changes.`,"profileEditor.import.imported":`Imported {{n}} locales: {{list}}`,"profileEditor.import.importedSingular":`Imported 1 locale: {{list}}`,"profileEditor.import.skipped":`Skipped {{n}} unrecognised locale keys: {{list}}`,"profileEditor.import.skippedSingular":`Skipped 1 unrecognised locale key: {{list}}`,"profileEditor.config.selectDefaultLocale":`Select default locale…`,"profileEditor.config.complianceGroup":`Compliance Group`,"profileEditor.config.complianceGroupNone":`None / Custom`,"profileEditor.config.gpcMode":`GPC Signal Mode`,"profileEditor.config.gpcModeDefault":`Default (inherit from compliance group)`,"profileEditor.config.gpcModePlaceholder":`Default`,"profileEditor.config.hidePoweredBy":`Hide "Powered by Consenti"`,"profileEditor.config.hidePoweredByHint":`Remove the branding link from the consent banner.`,"profileEditor.config.allowReceipt":`Allow consent receipt`,"profileEditor.config.allowReceiptHint":`Let visitors download a PDF receipt of their consent choices.`,"profileEditor.conflict.title":`Active profile conflict`,"profileEditor.conflict.message":`Profile "{{name}}" is already active for this compliance group. Only one profile can be active per group.`,"profileEditor.conflict.deactivate":`Deactivate "{{name}}" and activate this one`,"profileEditor.conflict.saveInactive":`Save this profile as inactive`,"profileEditor.compliance.errors.heading":`Compliance errors — fix before continuing:`,"profileEditor.compliance.warnings.heading":`Compliance warnings:`,"profileEditor.compliance.warnings.acknowledge":`I acknowledge these warnings and wish to continue`,"profileEditor.content.selectLocale":`Select locale…`,"profileEditor.content.addLocale":`+ Add locale`,"profileEditor.content.defaultLocaleLabel":`(default)`,_section_readability:`── Readability Warnings ─────────────────────────`,"readability.headingTooLong":`Heading is {{n}} characters — keep it under 80 for readability.`,"readability.avgSentenceLong":`Average sentence length is {{n}} words — aim for 25 or fewer.`,"readability.totalWordsLong":`Text is {{n}} words long — consider keeping banner copy under 150 words.`,"cookieTemplates.editor.gpcMandatoryTitle":`Mandatory cookies are never auto-denied by GPC`,"cookieTemplates.editor.loadDefaultsBtn":`Click here to load default cookies list`,"cookieTemplates.editor.confirmUpdate.title":`Update template used by {{n}} profiles?`,"cookieTemplates.editor.confirmUpdate.titleSingular":`Update template used by 1 profile?`,"cookieTemplates.editor.confirmUpdate.message":`Profiles: {{names}}.
2
-
3
- Saving will update cookie definitions for all profiles using this template. Continue?`,"cookieTemplates.editor.legalBasis.mandatoryUsage":`Mandatory (Strictly Necessary): The cookie is always granted — the visitor cannot turn it off. Use only for cookies genuinely required for the site to function (session tokens, CSRF, load balancing).`,"cookieTemplates.editor.legalBasis.mandatoryLawName":`ePrivacy Dir. Recital 25`,"cookieTemplates.editor.legalBasis.mandatoryLawText":`"Strictly necessary" cookies are exempt from consent. Do not mark analytics or advertising cookies as Mandatory.`,"cookieTemplates.editor.legalBasis.examples":`Consent: analytics_storage · ad_storage · Legitimate Interest: server-side analytics · Mandatory: session · csrf_token · load_balancer_id`,"uiTemplates.editor.loadDefaultsPrompt":`Start from scratch, or load a sensible default structure (buttons, categories, positions).`,"uiTemplates.editor.loadDefaultsBtn":`Load Defaults`,"uiTemplates.editor.confirmUpdate.title":`Update template used by {{n}} profiles?`,"uiTemplates.editor.confirmUpdate.titleSingular":`Update template used by 1 profile?`,"uiTemplates.editor.confirmUpdate.message":`Profiles: {{names}}.
4
-
5
- Saving will apply UI changes to all profiles using this template. Continue?`,"uiTemplates.editor.wizard.stepOf":`Étape {{step}} sur {{total}}`,"uiTemplates.editor.wizard.next":`Suivant`,"uiTemplates.editor.wizard.back":`Retour`,_section_howItWorks:`── Comment fonctionne Consenti ──────────────────────`,"nav.howItWorks":`Comment fonctionne Consenti`,"howItWorks.title":`Comment fonctionne Consenti`,"howItWorks.intro":`Consenti est une plateforme de gestion du consentement open-source conforme au RGPD. Elle gère la collecte, le stockage et le reporting du consentement aux cookies pour vos sites web. Ce guide présente le flux de travail principal et décrit chaque section du tableau de bord.`,"howItWorks.workflow.heading":`Flux de travail principal`,"howItWorks.workflow.step1.title":`Définir les catégories de cookies`,"howItWorks.workflow.step1.desc":`Accédez à Bannières de consentement → Modèles de cookies et créez un modèle listant toutes les catégories de cookies de votre site (ex. : analyse, marketing). Définissez la base légale et la durée de validité de chaque catégorie.`,"howItWorks.workflow.step2.title":`Concevoir l'interface de consentement`,"howItWorks.workflow.step2.desc":`Accédez à Bannières de consentement → Modèles UI et configurez la mise en page visuelle de votre bannière et de la modale de préférences — libellés des boutons, couleurs, style de mise en page et affichage des catégories.`,"howItWorks.workflow.step3.title":`Créer un profil de consentement`,"howItWorks.workflow.step3.desc":`Accédez à Bannières de consentement → Profils et combinez un Modèle de cookies avec un Modèle UI. Ajoutez du texte traduit pour chaque langue prise en charge, activez les réglementations requises (RGPD, CCPA, DPDPA) et publiez.`,"howItWorks.workflow.step4.title":`Intégrer le widget`,"howItWorks.workflow.step4.desc":`Copiez votre clé API depuis API → Configuration et ajoutez la balise script Consenti à votre site web. Le widget récupère votre profil publié et affiche automatiquement la bannière de consentement.`,"howItWorks.workflow.step5.title":`Surveiller et auditer`,"howItWorks.workflow.step5.desc":`Utilisez les pages Consentements et Visiteurs pour consulter les enregistrements de consentement en temps réel. Utilisez le Journal d'audit pour un historique infalsifiable de toutes les actions administratives comme preuve de conformité.`,"howItWorks.features.heading":`Fonctionnalités du tableau de bord`,"howItWorks.features.dashboard.title":`Tableau de bord`,"howItWorks.features.dashboard.desc":`L'écran d'accueil affiche des KPI en temps réel — total des consentements, taux d'acceptation, taux de refus et un graphique chronologique. Utilisez-le pour repérer les tendances et évaluer l'impact des modifications de bannière.`,"howItWorks.features.cookieTemplates.title":`Modèles de cookies`,"howItWorks.features.cookieTemplates.desc":`Listes réutilisables de catégories de cookies. Chaque catégorie possède un ID, une base légale (consentement, intérêt légitime, nécessaire), la gestion du signal GPC, une durée de validité et un mappage optionnel vers un fournisseur TCF ou une catégorie CPRA.`,"howItWorks.features.uiTemplates.title":`Modèles UI`,"howItWorks.features.uiTemplates.desc":`Contrôle l'apparence de la bannière de consentement, de l'avis GPC et de la modale de préférences. Configurez les jeux de boutons, les balises d'en-tête, l'opacité du calque superposé et l'ordre d'affichage des catégories.`,"howItWorks.features.profiles.title":`Profils`,"howItWorks.features.profiles.desc":`Un profil est l'unité déployable. Il associe un Modèle de cookies à un Modèle UI, stocke le contenu multilingue et suit un numéro de version pour permettre les retours en arrière. Un seul profil par domaine peut être actif à la fois.`,"howItWorks.features.consents.title":`Consentements`,"howItWorks.features.consents.desc":`Un journal consultable et filtrable de tous les enregistrements de consentement soumis par les visiteurs. Chaque enregistrement affiche l'ID du visiteur, le profil utilisé, la langue, le signal GPC, les choix de consentement et l'horodatage.`,"howItWorks.features.visitors.title":`Visiteurs`,"howItWorks.features.visitors.desc":`Une liste d'identifiants de visiteurs uniques sur vos sites, avec leur pays, leur date de première visite et leur date de dernière visite. Les identifiants de visiteurs sont des UUID pseudonymes stockés sans adresses IP brutes.`,"howItWorks.features.users.title":`Utilisateurs`,"howItWorks.features.users.desc":`Gérez les comptes administrateurs pouvant se connecter à ce tableau de bord. Attribuez des rôles, activez ou désactivez des comptes et restreignez les utilisateurs à des sites spécifiques dans les déploiements multi-tenant.`,"howItWorks.features.roles.title":`Rôles`,"howItWorks.features.roles.desc":`Définissez des ensembles de permissions nommés (ex. : Lecteur, Éditeur, Administrateur). Attribuez des permissions granulaires telles que consent:view, profile:edit ou audit:view à chaque rôle, puis assignez des rôles aux utilisateurs.`,"howItWorks.features.vendors.title":`Fournisseurs`,"howItWorks.features.vendors.desc":`Parcourez la Liste mondiale des fournisseurs (GVL) de l'IAB pour rechercher les identifiants de fournisseurs TCF, les finalités déclarées et les finalités d'intérêt légitime. Utilisez ces identifiants lors de la configuration des catégories de cookies dans vos modèles.`,"howItWorks.features.audit.title":`Journal d'audit`,"howItWorks.features.audit.desc":`Un journal en ajout seul et infalsifiable de chaque action administrative — sauvegardes de profils, modifications d'utilisateurs, création de clés API et plus. Requis pour les obligations de responsabilité du RGPD.`,"howItWorks.features.api.title":`API et clés`,"howItWorks.features.api.desc":`Générez et révoquez des jetons API, configurez les origines CORS autorisées pour l'API publique de consentement et parcourez la référence interactive OpenAPI pour comprendre chaque point de terminaison.`,"howItWorks.features.settings.title":`Paramètres`,"howItWorks.features.settings.desc":`Consultez les détails de votre compte, changez votre mot de passe et exportez les données de consentement ou d'audit en CSV, XLSX ou JSON pour une analyse hors ligne ou une soumission réglementaire.`,"howItWorks.docs.heading":`Documentation complète`,"howItWorks.docs.text":`Des guides détaillés, des références de configuration, des exemples d'intégration et un playground en direct sont disponibles sur le site de documentation de Consenti.`,"howItWorks.docs.link":`Ouvrir consenti.dev/docs →`,"howItWorks.consentFlow.heading":`Flux de consentement de bout en bout`,"howItWorks.consentFlow.step1.title":`Initialisation du widget`,"howItWorks.consentFlow.step1.desc":`Le script Consenti se charge dans le navigateur du visiteur et lit votre configuration (clé API, compliance.type). Si un cookie de consentement valide et non expiré existe déjà, le widget se ferme silencieusement — aucune bannière n'est affichée.`,"howItWorks.consentFlow.step2.title":`Juridiction détectée`,"howItWorks.consentFlow.step2.desc":`Si compliance.type est 'auto', le widget appelle GET /resolve-profile en transmettant le fuseau horaire, l'en-tête Accept-Language et l'adresse IP du visiteur. Le serveur associe ces signaux à un complianceGroup à l'aide de la carte pays → conformité intégrée.`,"howItWorks.consentFlow.step3.title":`Profil récupéré`,"howItWorks.consentFlow.step3.desc":`Le widget récupère le profil actif pour le complianceGroup résolu et la langue du visiteur. La réponse est un objet JSON plat contenant tout le texte de la bannière, les catégories de cookies, les paramètres UI et les indicateurs réglementaires — prêt à être rendu.`,"howItWorks.consentFlow.step4.title":`Bannière affichée`,"howItWorks.consentFlow.step4.desc":`Le widget affiche la bannière ou la fenêtre modale de préférences selon le modèle UI du profil. Les catégories obligatoires sont pré-cochées et ne peuvent pas être désélectionnées. Les catégories optionnelles indiquent leur base juridique (consentement ou intérêt légitime).`,"howItWorks.consentFlow.step5.title":`Consentement soumis`,"howItWorks.consentFlow.step5.desc":`Lorsque le visiteur agit (Tout accepter, Tout refuser ou Enregistrer les préférences), le widget envoie un POST à l'API avec l'enregistrement de consentement : ID visiteur, version du profil, statut par catégorie (accordé/refusé/objecté), signal GPC, horodatage et langue.`,"howItWorks.consentFlow.step6.title":`Stocké et audité`,"howItWorks.consentFlow.step6.desc":`L'API valide la charge utile, stocke l'enregistrement de consentement et ajoute une entrée au journal d'audit en ajout seul. L'enregistrement du visiteur est mis à jour avec le pays et les dates de première/dernière visite. Le widget écrit le cookie de consentement pour que les visites futures passent outre la bannière.`,"howItWorks.profileResolution.heading":`Algorithme de résolution de profil`,"howItWorks.profileResolution.intro":`À l'arrivée d'un visiteur, Consenti résout en cinq étapes le profil de consentement à afficher.`,"howItWorks.profileResolution.step1.title":`Signaux géographiques collectés`,"howItWorks.profileResolution.step1.desc":`Le widget envoie trois signaux à GET /resolve-profile : le fuseau horaire du navigateur (Intl.DateTimeFormat), l'en-tête Accept-Language (ou le paramètre lang), et l'adresse IP côté serveur.`,"howItWorks.profileResolution.step2.title":`Pays déterminé`,"howItWorks.profileResolution.step2.desc":`Le serveur essaie dans l'ordre : (1) géolocalisation IP via le geoDataProvider configuré ; (2) table de correspondance fuseau horaire → pays ; (3) heuristique balise de langue → pays (ex. 'fr' → FR). La première correspondance non vide l'emporte.`,"howItWorks.profileResolution.step3.title":`Groupe de conformité associé`,"howItWorks.profileResolution.step3.desc":`Le code pays ISO-3166-1 alpha-2 (plus le code région/état optionnel) est recherché dans la carte PAYS → GROUPE_DE_CONFORMITÉ intégrée. Un remplacement régional (ex. US/CA → optOutCalifornia) prend la priorité sur le défaut du pays.`,"howItWorks.profileResolution.step4.title":`Profil actif trouvé`,"howItWorks.profileResolution.step4.desc":`Le système interroge la base de données pour trouver le profil actif dont le complianceGroup correspond au groupe résolu. Un seul profil par complianceGroup peut être actif à la fois. Si aucun n'existe, une erreur 404 est renvoyée et le widget peut revenir à un profileOverride.`,"howItWorks.profileResolution.step5.title":`Langue résolue`,"howItWorks.profileResolution.step5.desc":`La meilleure langue est choisie par : (1) correspondance exacte avec la langue demandée par le widget ; (2) correspondance par préfixe de langue (ex. 'fr-BE' → 'fr') ; (3) langue résolue par le fournisseur ; (4) defaultLocale du profil. Le JSON résolu est servi depuis un fichier statique (profils publiés) ou directement depuis la base de données (aperçus).`,"howItWorks.complianceGroups.heading":`Groupes de conformité`,"howItWorks.complianceGroups.intro":`Chaque pays du monde est associé à l'un des huit groupes de conformité. Chaque groupe détermine le modèle de consentement que le widget doit suivre.`,"howItWorks.complianceGroups.optIn.title":`optIn — RGPD / ePrivacy Opt-In strict`,"howItWorks.complianceGroups.optIn.desc":`Le consentement préalable est obligatoire avant tout cookie non essentiel. Les visiteurs doivent avoir la possibilité de refuser, le retrait doit être aussi simple que le consentement, et des choix granulaires par catégorie sont requis.`,"howItWorks.complianceGroups.optIn.laws":`RGPD, Directive ePrivacy, UK RGPD, PECR, revLPD (CH), KVKK (TR), PDPA (TH) et autres lois nationales strictes`,"howItWorks.complianceGroups.optIn.countries":`Tous les États membres de l'UE, Royaume-Uni, Suisse, Turquie, Thaïlande, Islande, Liechtenstein, Norvège, Guernesey, Gibraltar et autres pays avec des règles ePrivacy strictes`,"howItWorks.complianceGroups.optInDPDPA.title":`optInDPDPA — Inde DPDPA`,"howItWorks.complianceGroups.optInDPDPA.desc":`La loi indienne sur la protection des données personnelles numériques 2023 exige un consentement explicite opt-in. Obligations supplémentaires : nommer un Data Fiduciary, fournir une notice de consentement dédiée et soutenir les droits des Data Principals. Définissez le champ dpdpaDataFiduciary dans votre profil.`,"howItWorks.complianceGroups.optInDPDPA.laws":`Digital Personal Data Protection Act 2023 (DPDPA)`,"howItWorks.complianceGroups.optInDPDPA.countries":`Inde (IN)`,"howItWorks.complianceGroups.optInChina.title":`optInChina — Cadre multi-lois chinois`,"howItWorks.complianceGroups.optInChina.desc":`La gouvernance des données en Chine exige un consentement explicite sous PIPL, combiné aux obligations de la loi sur la sécurité des données (DSL) et de la loi sur la cybersécurité (CSL). Des exigences supplémentaires s'appliquent aux transferts transfrontaliers et à la classification des données.`,"howItWorks.complianceGroups.optInChina.laws":`Loi sur la protection des informations personnelles (PIPL), Loi sur la sécurité des données (DSL), Loi sur la cybersécurité (CSL)`,"howItWorks.complianceGroups.optInChina.countries":`Chine (CN)`,"howItWorks.complianceGroups.optOutCalifornia.title":`optOutCalifornia — Californie CCPA / CPRA`,"howItWorks.complianceGroups.optOutCalifornia.desc":`Les données peuvent être collectées par défaut, mais les consommateurs doivent disposer d'une option claire pour refuser la vente ou le partage de leurs données personnelles. Le signal GPC (Global Privacy Control) doit être respecté comme un opt-out valide.`,"howItWorks.complianceGroups.optOutCalifornia.laws":`CCPA, CPRA (California Consumer Privacy Act / California Privacy Rights Act)`,"howItWorks.complianceGroups.optOutCalifornia.countries":`États-Unis — Californie (US/CA)`,"howItWorks.complianceGroups.optOutUSState.title":`optOutUSState — Autres États américains`,"howItWorks.complianceGroups.optOutUSState.desc":`Inspiré du cadre californien d'opt-out. Les consommateurs peuvent refuser la publicité ciblée et la vente de données personnelles. Plusieurs États exigent le respect du signal GPC.`,"howItWorks.complianceGroups.optOutUSState.laws":`CDPA (VA), CPA (CO), CTDPA (CT), UCPA (UT), TDPSA (TX), DPDPA (DE), NJDPA (NJ), OCPA (OR), MCDPA (MN), MODPA (MD), KCDPA (KY), TIPA (TN), NDPA (NE), ICDPA (IA/IN), MCDPA (MT), NHPA (NH), RIDTPA (RI)`,"howItWorks.complianceGroups.optOutUSState.countries":`États-Unis — VA, CO, CT, UT, TX, DE, NJ, OR, MN, MD, KY, TN, NE, IA, IN, MT, NH, RI`,"howItWorks.complianceGroups.generalPrivacyConsent.title":`generalPrivacyConsent — Confidentialité générale / Consentement`,"howItWorks.complianceGroups.generalPrivacyConsent.desc":`Une loi générale sur la protection des données s'applique mais n'impose pas de bannière cookie stricte de type PECR/ePrivacy. La meilleure pratique est d'offrir un choix de consentement pour les cookies non essentiels et une notice de confidentialité claire, mais l'exigence légale est inférieure au niveau opt-in du RGPD.`,"howItWorks.complianceGroups.generalPrivacyConsent.laws":`PIPEDA / Loi 25 (CA), LGPD (BR — utiliser hybridBrazil), POPIA (ZA), APPI (JP), Privacy Act (AU/NZ), PDPA-SG, PDPA-MY, PIPA-KR, PDPD-VN, DPA-PH, PDP-ID et de nombreux autres`,"howItWorks.complianceGroups.generalPrivacyConsent.countries":`Canada, Australie, Nouvelle-Zélande, Japon, Corée du Sud, Singapour, Malaisie, Afrique du Sud, et de nombreux pays d'Amérique latine, d'Afrique et d'Asie`,"howItWorks.complianceGroups.hybridBrazil.title":`hybridBrazil — Brésil LGPD`,"howItWorks.complianceGroups.hybridBrazil.desc":`La LGPD brésilienne est globalement similaire au RGPD, mais les cookies d'analyse et de publicité peuvent être traités sous la base de l'intérêt légitime selon l'évaluation du responsable de traitement. La bannière est affichée, mais la base juridique par catégorie peut être plus nuancée qu'un opt-in strict RGPD.`,"howItWorks.complianceGroups.hybridBrazil.laws":`Lei Geral de Proteção de Dados (LGPD)`,"howItWorks.complianceGroups.hybridBrazil.countries":`Brésil (BR)`,"howItWorks.complianceGroups.noticeOnly.title":`noticeOnly — Notice de confidentialité uniquement`,"howItWorks.complianceGroups.noticeOnly.desc":`Aucune réglementation spécifique aux cookies ne s'applique, ou le régime existant ne requiert qu'une notice de confidentialité — ni opt-in ni opt-out obligatoire. L'affichage d'une bannière de consentement reste recommandé pour la transparence, mais n'est pas légalement imposé.`,"howItWorks.complianceGroups.noticeOnly.laws":`Variable — pays sans réglementation dédiée aux cookies / à l'ePrivacy`,"howItWorks.complianceGroups.noticeOnly.countries":`Nombreux pays d'Afrique, d'Asie centrale, des Caraïbes et du Pacifique non couverts par les groupes ci-dessus`,"howItWorks.enums.heading":`Référence des valeurs clés`,"howItWorks.enums.legalBasis.heading":`legalBasis (catégorie de cookie)`,"howItWorks.enums.legalBasis.mandatory":`mandatory — La catégorie est toujours active quelle que soit la décision de consentement (ex. session, authentification). Jamais bloquée par GPC ou les signaux d'opt-out.`,"howItWorks.enums.legalBasis.consent":`consent — Nécessite un opt-in explicite du visiteur. Bloqué par défaut ; bloqué par GPC dans toutes les juridictions opt-in.`,"howItWorks.enums.legalBasis.legitimateInterest":`legitimate_interest — Repose sur l'intérêt légitime du responsable de traitement. Actif par défaut ; le visiteur peut s'y opposer. Soft-bloqué par GPC dans certaines juridictions (UE, RU).`,"howItWorks.enums.consentStatus.heading":`ConsentStatus (par enregistrement de catégorie)`,"howItWorks.enums.consentStatus.granted":`granted — Le visiteur a donné son consentement explicite pour cette catégorie.`,"howItWorks.enums.consentStatus.denied":`denied — Le visiteur a explicitement refusé son consentement pour cette catégorie.`,"howItWorks.enums.consentStatus.objected":`objected — Le visiteur s'est opposé à une catégorie à intérêt légitime (opt-out, pas un refus de consentement).`,"howItWorks.enums.geoProvider.heading":`Options geoDataProvider`,"howItWorks.enums.geoProvider.default":`default / timezone — Utilise le fuseau horaire du navigateur (Intl.DateTimeFormat) pour déduire le pays, avec repli sur Accept-Language. Aucune dépendance supplémentaire.`,"howItWorks.enums.geoProvider.language":`language — Déduit le pays uniquement depuis l'en-tête Accept-Language (ex. 'fr' → FR, 'pt' → BR). Rapide mais imprécis.`,"howItWorks.enums.geoProvider.geoip":`geoip — Utilise le package npm geoip-lite avec une base de données MaxMind Lite intégrée. Requis : npm install geoip-lite.`,"howItWorks.enums.geoProvider.hostedGeoipLite":`hosted-geoip-lite — Appelle ipinfo.io via HTTPS intégré (aucune dépendance supplémentaire). Ajoute ~50–200 ms par première visite.`,"howItWorks.enums.geoProvider.maxmind":`maxmind — Utilise le package npm maxmind avec un fichier local GeoLite2-City.mmdb. Le plus précis. Nécessite la variable d'environnement MAXMIND_DB_PATH et npm install maxmind.`,"howItWorks.enums.geoProvider.custom":`Fonction personnalisée — Passez une CountryResolverFn à compliance.geoDataProvider pour intégrer n'importe quel fournisseur géo-IP ou CDN.`};export{e as default};