diff --git a/public/locales/de/privacy.json b/public/locales/de/privacy.json index d6ba8b59..f95ed83e 100644 --- a/public/locales/de/privacy.json +++ b/public/locales/de/privacy.json @@ -1,128 +1,145 @@ { "meta": { - "title": "Datenschutzerklärung | Tractatus AI-Sicherheits-Framework", - "description": "Datenschutzerklärung für das Tractatus AI-Sicherheits-Framework. Erfahren Sie, wie wir Ihre Daten sammeln, verwenden und schützen." + "title": "Datenschutzrichtlinie | Tractatus AI Safety Framework", + "description": "Datenschutzrichtlinie für den Tractatus AI Safety Framework. Erfahren Sie, wie wir Ihre Daten sammeln, verwenden und schützen." }, "header": { - "title": "Datenschutzerklärung", - "last_updated": "Zuletzt aktualisiert: 8. Oktober 2025" + "title": "Datenschutzbestimmungen", + "last_updated": "Zuletzt aktualisiert: Oktober 28, 2025" }, "privacy_first": { "badge": "Datenschutz zuerst:", - "text": "Das Tractatus Framework basiert auf den Prinzipien der menschlichen Selbstbestimmung und Transparenz. Wir sammeln minimale Daten, verkaufen niemals Ihre Informationen und geben Ihnen die volle Kontrolle über Ihre Daten." + "text": "Das Tractatus Framework basiert auf den Prinzipien der menschlichen Handlungsfähigkeit und Transparenz. Wir sammeln nur minimale Daten, verkaufen Ihre Informationen nicht und geben Ihnen die volle Kontrolle über Ihre Daten." }, "section_1": { - "title": "1. Informationen, die wir sammeln", + "title": "1. Gesammelte Informationen", "subtitle_1_1": "1.1 Von Ihnen bereitgestellte Informationen", "items_1_1": [ - "Spenden (Koha): Name (optional), E-Mail-Adresse (erforderlich für Quittung), Land (optional), Zahlungsinformationen (von Stripe verarbeitet, nicht von uns gespeichert)", - "Medienanfragen: Name, E-Mail, Organisation, Anfragedetails", - "Falleinreichungen: Kontaktinformationen, Fallbeschreibung, unterstützende Nachweise", + "Spenden (Koha): Name (optional), E-Mail-Adresse (für den Eingang erforderlich), Land (optional), Zahlungsinformationen (von Stripe verarbeitet, nicht bei uns gespeichert)", + "Medienanfragen: Name, E-Mail, Organisation, Details zur Anfrage", + "Einreichung von Fällen: Kontaktinformationen, Fallbeschreibung, Nachweise", "Kontoerstellung (falls zutreffend): E-Mail, Passwort (gehasht), optionale Profilinformationen" ], - "subtitle_1_2": "1.2 Automatisch erfasste Informationen", + "subtitle_1_2": "1.2 Automatisch gesammelte Informationen", "items_1_2": [ - "Analytik: Seitenaufrufe, verweisende Websites, Browsertyp, Gerätetyp, allgemeiner Standort (Länderebene)", - "Cookies: Sitzungsverwaltung, Präferenzen (z. B. ausgewählte Währung), Analytik", - "Server-Protokolle: IP-Adressen, Zugriffszeiten, aufgerufene Seiten (90 Tage für Sicherheit aufbewahrt)" + "Analytik: Seitenaufrufe, verweisende Websites, Browsertyp, Gerätetyp, allgemeiner Standort (auf Länderebene)", + "Cookies: Sitzungsverwaltung, Präferenzen (z. B. gewählte Währung), Analytik", + "Server-Protokolle: IP-Adressen, Zugriffszeiten, aufgerufene Seiten (aus Sicherheitsgründen 90 Tage lang aufbewahrt)" ], - "subtitle_1_3": "1.3 Währungsauswahl", - "text_1_3": "Wenn Sie eine Währung für Spenden auswählen, können wir Ihren ungefähren Standort erkennen, um eine geeignete Währung vorzuschlagen. Diese Standortdaten sind:", + "subtitle_1_3": "1.3 Auswahl der Währung", + "text_1_3": "Wenn Sie eine Währung für Spenden auswählen, können wir Ihren ungefähren Standort ermitteln, um eine geeignete Währung vorzuschlagen. Diese Standortdaten sind:", "items_1_3": [ - "Von Ihrer IP-Adresse abgeleitet (nur Länderebene, keine präzise Geolokalisierung)", - "Nur zur Vorauswahl einer Währung im Spendenformular verwendet", + "Abgeleitet von Ihrer IP-Adresse (nur auf Landesebene, keine genaue Geolokalisierung)", + "Wird nur zur Vorauswahl einer Währung im Spendenformular verwendet", "Nicht dauerhaft gespeichert", - "Kann durch manuelle Währungsauswahl überschrieben werden" + "Kann durch manuelle Währungsauswahl außer Kraft gesetzt werden" ] }, "section_2": { "title": "2. Wie wir Ihre Informationen verwenden", "items": [ - "Spenden verarbeiten: E-Mail-Quittungen, öffentliche Unterstützer anerkennen (nur opt-in), Transparenz-Dashboard pflegen", - "Auf Anfragen antworten: Medienfragen beantworten, Falleinreichungen prüfen, Support bieten", - "Dienste verbessern: Nutzungsmuster analysieren, Fehler beheben, Benutzererfahrung verbessern", - "Sicherheit: Betrug verhindern, Missbrauch erkennen, vor Angriffen schützen", - "Rechtliche Einhaltung: Geltende Gesetze einhalten, auf rechtliche Anfragen reagieren", - "Kommunikation: Quittungen senden, wichtige Updates (wir senden niemals Marketing-E-Mails ohne ausdrückliche Zustimmung)" + "Spenden verarbeiten: Quittungen per E-Mail versenden, öffentliche Unterstützer bestätigen (nur Opt-in), Transparenz-Dashboard pflegen", + "Beantworten Sie Anfragen: Beantwortung von Medienanfragen, Überprüfung von Fallaussendungen, Bereitstellung von Unterstützung", + "Verbesserung der Dienste: Analysieren von Nutzungsmustern, Beheben von Fehlern, Verbesserung der Benutzerfreundlichkeit", + "Sicherheit: Betrug verhindern, Missbrauch aufdecken, vor Angriffen schützen", + "Einhaltung von Gesetzen: Einhaltung der geltenden Gesetze, Beantwortung rechtlicher Anfragen", + "Mitteilungen: Versand von Quittungen, wichtigen Aktualisierungen (wir versenden niemals Marketing-E-Mails ohne ausdrückliche Zustimmung)" ] }, "section_3": { - "title": "3. Datenweitergabe und Offenlegung", + "title": "3. Weitergabe und Offenlegung von Daten", "subtitle_share": "Wir teilen Ihre Daten mit:", "share_items": [ - "Stripe: Zahlungsabwicklung für Spenden (unterliegt der Datenschutzerklärung von Stripe)", - "MongoDB Atlas: Datenbank-Hosting (unterliegt der Datenschutzerklärung von MongoDB)", - "E-Mail-Dienstanbieter: Zum Versenden von Quittungen und Kommunikation" + "Stripe: Zahlungsabwicklung für Spenden (vorbehaltlich der Datenschutzbestimmungen von Stripe)", + "MongoDB Atlas: Datenbank-Hosting in der EU (vorbehaltlich der Datenschutzrichtlinie von MongoDB)", + "E-Mail-Dienstanbieter: Für den Versand von Quittungen und Mitteilungen" ], - "subtitle_never": "Wir werden NIEMALS:", + "subtitle_never": "Wir NIEMALS:", "never_items": [ - "❌ Ihre persönlichen Daten verkaufen", - "❌ Ihre Daten mit Werbetreibenden teilen", - "❌ Ihre Daten für Tracking auf anderen Websites verwenden", - "❌ Spenderinformationen ohne ausdrückliche Zustimmung öffentlich teilen" + "❌ Verkaufen Sie Ihre persönlichen Daten", + "❌ Teilen Sie Ihre Daten mit Werbetreibenden", + "❌ Verwendung Ihrer Daten zur Nachverfolgung auf anderen Websites", + "weitergabe von Spenderdaten an die Öffentlichkeit ohne ausdrückliches Einverständnis" ], "subtitle_legal": "Rechtliche Offenlegungen:", - "legal_text": "Wir können Ihre Informationen offenlegen, wenn dies gesetzlich, durch Gerichtsbeschluss oder zum Schutz unserer Rechte und Sicherheit erforderlich ist. Wir werden Sie über solche Anfragen benachrichtigen, sofern gesetzlich nicht verboten." + "legal_text": "Wir können Ihre Daten weitergeben, wenn dies gesetzlich vorgeschrieben ist, durch Gerichtsbeschluss oder zum Schutz unserer Rechte und Sicherheit. Wir werden Sie über solche Anfragen informieren, sofern dies nicht gesetzlich verboten ist." }, "section_4": { - "title": "4. Datenaufbewahrung", + "title": "4. Aufbewahrung von Daten", "items": [ - "Spendenaufzeichnungen: Auf unbestimmte Zeit für Transparenz und Steuerzwecke aufbewahrt", - "Server-Protokolle: Nach 90 Tagen gelöscht", - "Analytikdaten: Nach 12 Monaten aggregiert und anonymisiert", - "Benutzerkonten: Aufbewahrt, bis Sie die Löschung beantragen", - "Anfragen/Einreichungen: 2 Jahre aufbewahrt, dann archiviert oder gelöscht" + "Spendenaufzeichnungen: 7 Jahre lang für steuerliche und rechtliche Zwecke aufbewahren", + "Server-Protokolle: Gelöscht nach 90 Tagen", + "Analytische Daten: Aggregiert und anonymisiert nach 14 Monaten", + "Benutzerkonten: Wird aufbewahrt, bis Sie die Löschung beantragen, plus 30 Tage", + "Anfragen/Eingaben: 2 Jahre lang aufbewahrt, dann archiviert oder gelöscht" ] }, "section_5": { "title": "5. Ihre Rechte", - "intro": "Sie haben das Recht auf:", + "intro": "Sie haben das Recht dazu:", "items": [ - "Zugang: Kopie Ihrer persönlichen Daten anfordern", - "Berichtigung: Ungenaue Informationen aktualisieren oder korrigieren", - "Löschung: Löschung Ihrer Daten beantragen (vorbehaltlich gesetzlicher Verpflichtungen)", - "Übertragbarkeit: Ihre Daten in maschinenlesbarem Format erhalten", - "Widerspruch: Zustimmung zu öffentlichen Anerkennungen jederzeit widerrufen", - "Einspruch: Der Verarbeitung Ihrer Daten widersprechen" + "Zugang: Beantragen Sie eine Kopie Ihrer persönlichen Daten", + "Berichtigung: Aktualisieren oder korrigieren Sie ungenaue Informationen", + "Löschung: Beantragen Sie die Löschung Ihrer Daten (vorbehaltlich der gesetzlichen Verpflichtungen)", + "Übertragbarkeit: Erhalten Sie Ihre Daten in einem maschinenlesbaren Format (JSON, CSV)", + "Abmelden: Sie können Ihre Zustimmung zu öffentlichen Bestätigungen jederzeit widerrufen", + "Einspruch: Widerspruch gegen die Verarbeitung Ihrer Daten" ], - "contact": "Um Ihre Rechte auszuüben, senden Sie eine E-Mail an: privacy@agenticgovernance.digital" + "contact": "Um Ihre Rechte wahrzunehmen, senden Sie eine E-Mail an: privacy@agenticgovernance.digital" }, "section_6": { "title": "6. Cookies und Tracking", - "essential": "Wesentliche Cookies: Erforderlich für die Funktionalität der Website (Sitzungsverwaltung, Authentifizierung)", - "preference": "Präferenz-Cookies: Merken sich Ihre Einstellungen (Währungsauswahl, Theme-Präferenzen)", - "analytics": "Analytik-Cookies: Datenschutzfreundliche Analytik (kein seitenübergreifendes Tracking)", - "control": "Sie können Cookies über Ihre Browsereinstellungen steuern. Das Deaktivieren von Cookies kann die Funktionalität der Website beeinträchtigen." + "essential": "Wesentliche Cookies: Für die Funktionalität der Website erforderlich (Sitzungsmanagement, Authentifizierung)", + "preference": "Präferenz-Cookies: Erinnern Sie sich an Ihre Einstellungen (Währungsauswahl, Themenpräferenzen)", + "analytics": "Analyse-Cookies: Datenschutzkonforme Analyse (kein Cross-Site-Tracking)", + "control": "Sie können Cookies über Ihre Browsereinstellungen steuern. Die Deaktivierung von Cookies kann die Funktionalität der Website beeinträchtigen." }, "section_7": { "title": "7. Sicherheit", - "intro": "Wir implementieren branchenübliche Sicherheitsmaßnahmen:", + "intro": "Wir setzen branchenübliche Sicherheitsmaßnahmen ein:", "items": [ - "HTTPS-Verschlüsselung für alle Verbindungen", - "Verschlüsselte Datenbankspeicherung", - "Passwort-Hashing (bcrypt)", - "Regelmäßige Sicherheitsaudits", - "Zugriffskontrollen und Überwachung", - "Keine Speicherung von Zahlungskartendaten (von PCI-konformen Stripe-Systemen verwaltet)" + "TLS 1.3-Verschlüsselung für alle Verbindungen", + "Verschlüsselte Datenbankspeicherung (AES-256 im Ruhezustand)", + "Passwort-Hashing (bcrypt mit Salt)", + "Regelmäßige Sicherheitsüberprüfungen und Schwachstellen-Scans", + "Zugangskontrollen und Überwachung der Eindringlingserkennung", + "Keine Speicherung von Zahlungskartendaten (wird von Stripe PCI-konformen Systemen übernommen)" ], - "disclaimer": "Obwohl wir angemessene Vorsichtsmaßnahmen treffen, ist kein System zu 100% sicher. Sicherheitsprobleme melden Sie bitte an: security@agenticgovernance.digital" + "disclaimer": "Obwohl wir angemessene Vorsichtsmaßnahmen ergreifen, ist kein System zu 100 % sicher. Melden Sie Sicherheitsprobleme an: security@agenticgovernance.digital" }, "section_8": { "title": "8. Datenschutz für Kinder", - "text": "Das Tractatus Framework richtet sich nicht an Kinder unter 13 Jahren. Wir sammeln wissentlich keine Informationen von Kindern. Wenn Sie glauben, dass ein Kind uns personenbezogene Daten zur Verfügung gestellt hat, kontaktieren Sie uns bitte unter privacy@agenticgovernance.digital." + "text": "Der Tractatus Framework richtet sich nicht an Kinder unter 13 Jahren. Wir sammeln nicht wissentlich Informationen von Kindern. Wenn Sie glauben, dass ein Kind uns persönliche Daten zur Verfügung gestellt hat, kontaktieren Sie uns bitte unter privacy@agenticgovernance.digital." }, "section_9": { - "title": "9. Internationale Datenübertragungen", - "intro": "Das Tractatus Framework wird von Neuseeland aus betrieben. Wenn Sie von anderen Ländern aus auf unsere Dienste zugreifen, können Ihre Daten nach Neuseeland übertragen und dort verarbeitet werden. Durch die Nutzung unserer Dienste stimmen Sie dieser Übertragung zu.", - "gdpr": "DSGVO-Konformität: Für EU-Nutzer erfüllen wir die DSGVO-Anforderungen, einschließlich rechtmäßiger Grundlage für die Verarbeitung, Datenminimierung und Ihrer Rechte gemäß den Artikeln 15-22." + "title": "9. Datenstandort und internationale Operationen", + "intro": "Das Tractatus Framework wird von Aotearoa Neuseeland aus verwaltet, aber unsere Infrastruktur wird bei OVHCloud in der Europäischen Union (Frankreich) gehostet. Ihre Daten werden innerhalb der EU gespeichert und verarbeitet und unterliegen den strengen EU-Datenschutzstandards.", + "gdpr": "DSGVO-Konformität: Für EU-Nutzer erfüllen wir die DSGVO-Anforderungen, einschließlich rechtmäßiger Grundlage für die Verarbeitung, Datenminimierung und Ihrer Rechte gemäß den Artikeln 15-22.", + "hosting_heading": "Hosting und Datenaufenthalt:", + "hosting_items": { + "0": "Primäres Hosting: OVHCloud (Frankreich, EU) - alle Nutzerdaten werden in der EU gespeichert", + "1": "Datenbank: MongoDB Atlas (Region EU-West, Frankfurt, Deutschland)", + "2": "Zahlungsabwicklung: Stripe (verwendet Standardvertragsklauseln für EU-US-Datenübertragungen)", + "3": "Keine Datenübermittlung nach Neuseeland: Ihre personenbezogenen Daten werden nicht nach Neuseeland übermittelt oder dort verarbeitet" + }, + "gdpr_heading": "GDPR-Einhaltung:", + "gdpr_text": "Da unsere Infrastruktur in der EU gehostet wird, profitieren wir von den Schutzbestimmungen der Allgemeinen Datenschutzverordnung (GDPR). Die Daten von EU-Benutzern verlassen während des normalen Betriebs niemals die EU-Gerichtsbarkeit. Wir erfüllen die Anforderungen der GDPR, einschließlich:", + "gdpr_items": { + "0": "Rechtmäßige Grundlage für die Verarbeitung (Artikel 6)", + "1": "Datenminimierung und Zweckbindung (Artikel 5)", + "2": "Ihre Rechte gemäß Artikel 15-22 (Zugang, Berichtigung, Löschung, Übertragbarkeit, Widerspruch)", + "3": "Datenschutz durch Technik und Voreinstellungen (Artikel 25)", + "4": "Maßnahmen zur Datensicherheit (Artikel 32)" + }, + "non_eu_text": "Für Nicht-EU-Nutzer: Ihre Daten werden in der EU verarbeitet und profitieren vom GDPR-Schutz, unabhängig von Ihrem Standort. Wir erweitern die GDPR-Rechte auf alle Nutzer weltweit." }, "section_10": { - "title": "10. Änderungen dieser Richtlinie", - "text": "Wir können diese Datenschutzerklärung von Zeit zu Zeit aktualisieren. Änderungen werden auf dieser Seite mit aktualisiertem \"Zuletzt aktualisiert\"-Datum veröffentlicht. Wesentliche Änderungen werden per E-Mail (für Benutzer, die eine E-Mail angegeben haben) oder durch einen auffälligen Hinweis auf der Website kommuniziert." + "title": "10. Änderungen an dieser Politik", + "text": "Wir können diese Datenschutzrichtlinie von Zeit zu Zeit aktualisieren. Änderungen werden auf dieser Seite mit einem aktualisierten Datum der letzten Aktualisierung veröffentlicht. Wesentliche Änderungen werden per E-Mail (für Nutzer, die eine E-Mail angegeben haben) oder durch einen deutlichen Hinweis auf der Website bekannt gegeben." }, "section_11": { - "title": "11. Kontaktieren Sie uns", - "intro": "Für datenschutzbezogene Fragen oder Bedenken:", + "title": "11. Kontakt", + "intro": "Bei Fragen oder Anliegen zum Datenschutz:", "email": "E-Mail:", "email_address": "privacy@agenticgovernance.digital", "dpo": "Datenschutzbeauftragter:", @@ -131,7 +148,7 @@ "postal_text": "Auf Anfrage erhältlich" }, "te_tiriti": { - "title": "Te Tiriti o Waitangi | Vertragsbekenntnis", - "text": "Als neuseeländisches Projekt erkennen wir Te Tiriti o Waitangi und unser Bekenntnis zu Partnerschaft, Schutz und Teilhabe an. Unsere Datenschutzpraktiken respektieren Māori-Konzepte der Datensouveränität (rangatiratanga) und kollektiven Vormundschaft (kaitiakitanga)." + "title": "Te Tiriti o Waitangi | Vertragsverpflichtung", + "text": "Als ein in Neuseeland ansässiges Projekt erkennen wir Te Tiriti o Waitangi und unsere Verpflichtung zu Partnerschaft, Schutz und Beteiligung an. Unsere Datenschutzpraktiken respektieren die Māori-Konzepte der Datensouveränität (rangatiratanga) und der kollektiven Vormundschaft (kaitiakitanga)." } } diff --git a/public/locales/en/privacy.json b/public/locales/en/privacy.json index 4da06f40..f15e60ac 100644 --- a/public/locales/en/privacy.json +++ b/public/locales/en/privacy.json @@ -5,7 +5,7 @@ }, "header": { "title": "Privacy Policy", - "last_updated": "Last updated: October 8, 2025" + "last_updated": "Last updated: October 28, 2025" }, "privacy_first": { "badge": "Privacy First:", @@ -18,7 +18,7 @@ "Donations (Koha): Name (optional), email address (required for receipt), country (optional), payment information (processed by Stripe, not stored by us)", "Media Inquiries: Name, email, organization, inquiry details", "Case Submissions: Contact information, case description, supporting evidence", - "Account Creation (if applicable): Email, password (hashed), optional profile information" + "Account Creation (if applicable): Email, credentials (hashed), optional profile information" ], "subtitle_1_2": "1.2 Automatically Collected Information", "items_1_2": [ @@ -51,7 +51,7 @@ "subtitle_share": "We Share Your Data With:", "share_items": [ "Stripe: Payment processing for donations (subject to Stripe's Privacy Policy)", - "MongoDB Atlas: Database hosting (subject to MongoDB's Privacy Policy)", + "MongoDB Atlas: Database hosting in EU (subject to MongoDB's Privacy Policy)", "Email Service Provider: For sending receipts and communications" ], "subtitle_never": "We NEVER:", @@ -67,10 +67,10 @@ "section_4": { "title": "4. Data Retention", "items": [ - "Donation Records: Retained indefinitely for transparency and tax purposes", + "Donation Records: Retained for 7 years for tax and legal requirements", "Server Logs: Deleted after 90 days", - "Analytics Data: Aggregated, anonymized after 12 months", - "User Accounts: Retained until you request deletion", + "Analytics Data: Aggregated and anonymized after 14 months", + "User Accounts: Retained until you request deletion, plus 30 days", "Inquiries/Submissions: Retained for 2 years, then archived or deleted" ] }, @@ -81,7 +81,7 @@ "Access: Request a copy of your personal data", "Correction: Update or correct inaccurate information", "Deletion: Request deletion of your data (subject to legal obligations)", - "Portability: Receive your data in a machine-readable format", + "Portability: Receive your data in a machine-readable format (JSON, CSV)", "Opt-Out: Withdraw consent for public acknowledgements anytime", "Object: Object to processing of your data" ], @@ -98,23 +98,39 @@ "title": "7. Security", "intro": "We implement industry-standard security measures:", "items": [ - "HTTPS encryption for all connections", - "Encrypted database storage", - "Password hashing (bcrypt)", - "Regular security audits", - "Access controls and monitoring", + "TLS 1.3 encryption for all connections", + "Encrypted database storage (AES-256 at rest)", + "Password hashing (bcrypt with salt)", + "Regular security audits and vulnerability scanning", + "Access controls and intrusion detection monitoring", "No storage of payment card data (handled by Stripe PCI-compliant systems)" ], - "disclaimer": "While we take reasonable precautions, no system is 100% secure. Report security issues to: security@agenticgovernance.digital" + "disclaimer": "While we take reasonable precautions, no system is completely secure. Report security issues to: security@agenticgovernance.digital" }, "section_8": { "title": "8. Children's Privacy", "text": "The Tractatus Framework is not directed at children under 13. We do not knowingly collect information from children. If you believe a child has provided us with personal data, please contact us at privacy@agenticgovernance.digital." }, "section_9": { - "title": "9. International Data Transfers", - "intro": "The Tractatus Framework operates from New Zealand. If you access our services from other countries, your data may be transferred to and processed in New Zealand. By using our services, you consent to this transfer.", - "gdpr": "GDPR Compliance: For EU users, we comply with GDPR requirements including lawful basis for processing, data minimization, and your rights under Articles 15-22." + "title": "9. Data Location and International Operations", + "intro": "The Tractatus Framework is administered from Aotearoa New Zealand, but our infrastructure is hosted with OVHCloud in the European Union (France). Your data is stored and processed within the EU, benefiting from robust EU data protection standards.", + "hosting_heading": "Hosting and Data Residency:", + "hosting_items": [ + "Primary Hosting: OVHCloud (France, EU) - all user data stored in EU jurisdiction", + "Database: MongoDB Atlas (EU-West region, Frankfurt, Germany)", + "Payment Processing: Stripe (uses Standard Contractual Clauses for EU-US data transfers)", + "No Data Transfer to NZ: Your personal data is not transferred to or processed in New Zealand" + ], + "gdpr_heading": "GDPR Compliance:", + "gdpr_text": "As our infrastructure is hosted in the EU, we benefit from the protections of the General Data Protection Regulation (GDPR). EU users' data never leaves EU jurisdiction during normal operations. We comply with GDPR requirements including:", + "gdpr_items": [ + "Lawful basis for processing (Article 6)", + "Data minimization and purpose limitation (Article 5)", + "Your rights under Articles 15-22 (access, rectification, erasure, portability, objection)", + "Privacy by Design and Default (Article 25)", + "Data security measures (Article 32)" + ], + "non_eu_text": "For non-EU users: Your data is processed in the EU and benefits from GDPR protections, regardless of your location. We extend GDPR rights to all users globally." }, "section_10": { "title": "10. Changes to This Policy", diff --git a/public/locales/fr/privacy.json b/public/locales/fr/privacy.json index 8eef1218..9af7d570 100644 --- a/public/locales/fr/privacy.json +++ b/public/locales/fr/privacy.json @@ -5,73 +5,73 @@ }, "header": { "title": "Politique de confidentialité", - "last_updated": "Dernière mise à jour : 8 octobre 2025" + "last_updated": "Dernière mise à jour : 28 octobre 2025" }, "privacy_first": { - "badge": "Confidentialité d'abord :", - "text": "Le Tractatus Framework est construit sur les principes d'autonomie humaine et de transparence. Nous collectons un minimum de données, ne vendons jamais vos informations et vous donnons un contrôle total sur vos données." + "badge": "Le respect de la vie privée d'abord :", + "text": "Le cadre Tractatus repose sur les principes de l'action humaine et de la transparence. Nous collectons un minimum de données, nous ne vendons jamais vos informations et nous vous donnons le contrôle total de vos données." }, "section_1": { - "title": "1. Informations que nous collectons", + "title": "1. Informations collectées", "subtitle_1_1": "1.1 Informations que vous fournissez", "items_1_1": [ - "Dons (Koha) : Nom (optionnel), adresse e-mail (obligatoire pour le reçu), pays (optionnel), informations de paiement (traitées par Stripe, non stockées par nous)", - "Demandes médias : Nom, e-mail, organisation, détails de la demande", - "Soumissions de cas : Informations de contact, description du cas, preuves à l'appui", - "Création de compte (le cas échéant) : E-mail, mot de passe (haché), informations de profil optionnelles" + "Dons (Koha) : Nom (facultatif), adresse électronique (nécessaire pour la réception), pays (facultatif), informations de paiement (traitées par Stripe, non stockées par nous)", + "Demandes de renseignements des médias : Nom, courriel, organisation, détails de la demande", + "Soumissions de cas : Coordonnées, description du cas, preuves à l'appui", + "Création du compte (le cas échéant) : Courriel, mot de passe (haché), informations facultatives sur le profil" ], "subtitle_1_2": "1.2 Informations collectées automatiquement", "items_1_2": [ - "Analytique : Pages vues, sites référents, type de navigateur, type d'appareil, localisation générale (niveau pays)", - "Cookies : Gestion de session, préférences (par ex., devise sélectionnée), analytique", - "Journaux du serveur : Adresses IP, heures d'accès, pages consultées (conservées 90 jours pour la sécurité)" + "Analyses : Pages consultées, sites de référence, type de navigateur, type d'appareil, emplacement général (au niveau du pays)", + "Cookies : Gestion des sessions, préférences (par exemple, devise sélectionnée), analyse", + "Journaux du serveur : Adresses IP, temps d'accès, pages consultées (conservés pendant 90 jours pour des raisons de sécurité)" ], - "subtitle_1_3": "1.3 Sélection de devise", - "text_1_3": "Lorsque vous sélectionnez une devise pour les dons, nous pouvons détecter votre emplacement approximatif pour suggérer une devise appropriée. Ces données de localisation sont :", + "subtitle_1_3": "1.3 Sélection de la monnaie", + "text_1_3": "Lorsque vous sélectionnez une devise pour les dons, nous pouvons détecter votre emplacement approximatif afin de vous proposer une devise appropriée. Ces données de localisation sont :", "items_1_3": [ - "Dérivées de votre adresse IP (niveau pays uniquement, pas de géolocalisation précise)", - "Utilisées uniquement pour présélectionner une devise dans le formulaire de don", - "Non stockées de façon permanente", - "Peuvent être remplacées par une sélection manuelle de devise" + "Dérivé de votre adresse IP (au niveau du pays uniquement, pas de géolocalisation précise)", + "Utilisé uniquement pour présélectionner une devise dans le formulaire de don", + "Non stocké de façon permanente", + "Peut être remplacé par une sélection manuelle de la devise" ] }, "section_2": { "title": "2. Comment nous utilisons vos informations", "items": [ - "Traiter les dons : Envoyer des reçus par e-mail, reconnaître les supporters publics (opt-in uniquement), maintenir le tableau de transparence", - "Répondre aux demandes : Répondre aux questions des médias, examiner les soumissions de cas, fournir un support", - "Améliorer les services : Analyser les modèles d'utilisation, corriger les bugs, améliorer l'expérience utilisateur", + "Traitement des dons : Envoyer des reçus par courrier électronique, accuser réception des soutiens publics (opt-in uniquement), tenir un tableau de bord de la transparence", + "Répondre aux demandes de renseignements : Répondre aux questions des médias, examiner les dossiers soumis, fournir une assistance", + "Améliorer les services : Analyser les modèles d'utilisation, corriger les bogues, améliorer l'expérience des utilisateurs", "Sécurité : Prévenir la fraude, détecter les abus, protéger contre les attaques", - "Conformité légale : Se conformer aux lois applicables, répondre aux demandes légales", - "Communications : Envoyer des reçus, mises à jour importantes (nous n'envoyons jamais d'e-mails marketing sans opt-in explicite)" + "Conformité juridique : Respecter les lois applicables, répondre aux demandes légales", + "Communications : Envoi de reçus, de mises à jour importantes (nous n'envoyons jamais d'e-mails marketing sans consentement explicite)" ] }, "section_3": { "title": "3. Partage et divulgation des données", "subtitle_share": "Nous partageons vos données avec :", "share_items": [ - "Stripe : Traitement des paiements pour les dons (soumis à la Politique de confidentialité de Stripe)", - "MongoDB Atlas : Hébergement de base de données (soumis à la Politique de confidentialité de MongoDB)", - "Fournisseur de services e-mail : Pour l'envoi de reçus et de communications" + "Stripe : traitement des paiements pour les dons (soumis à la politique de confidentialité de Stripe)", + "Atlas MongoDB : Hébergement de bases de données dans l'UE (soumis à la politique de confidentialité de MongoDB)", + "Fournisseur de services de courrier électronique : Pour l'envoi de reçus et de communications" ], - "subtitle_never": "Nous ne faisons JAMAIS :", + "subtitle_never": "Nous n'avons JAMAIS :", "never_items": [ - "❌ Vendre vos données personnelles", + "❌ Vendre vos données à caractère personnel", "❌ Partager vos données avec des annonceurs", "❌ Utiliser vos données pour le suivi sur d'autres sites web", - "❌ Partager les informations des donateurs publiquement sans opt-in explicite" + "partager publiquement les informations relatives aux donateurs sans consentement explicite de leur part" ], - "subtitle_legal": "Divulgations légales :", - "legal_text": "Nous pouvons divulguer vos informations si la loi l'exige, par ordonnance du tribunal, ou pour protéger nos droits et notre sécurité. Nous vous informerons de telles demandes sauf si la loi l'interdit." + "subtitle_legal": "Informations légales :", + "legal_text": "Nous pouvons divulguer vos informations si la loi l'exige, si un tribunal l'ordonne ou pour protéger nos droits et notre sécurité. Nous vous informerons de ces demandes, sauf si la loi l'interdit." }, "section_4": { "title": "4. Conservation des données", "items": [ - "Enregistrements de dons : Conservés indéfiniment à des fins de transparence et fiscales", + "Registres des dons : Conservés pendant 7 ans pour des raisons fiscales et légales", "Journaux du serveur : Supprimés après 90 jours", - "Données analytiques : Agrégées, anonymisées après 12 mois", - "Comptes utilisateurs : Conservés jusqu'à ce que vous demandiez la suppression", - "Demandes/Soumissions : Conservées pendant 2 ans, puis archivées ou supprimées" + "Données analytiques : Agrégées et anonymisées après 14 mois", + "Comptes d'utilisateurs : Conservés jusqu'à ce que vous demandiez leur suppression, plus 30 jours", + "Demandes de renseignements / soumissions : Conservées pendant 2 ans, puis archivées ou supprimées" ] }, "section_5": { @@ -79,51 +79,68 @@ "intro": "Vous avez le droit de :", "items": [ "Accès : Demander une copie de vos données personnelles", - "Rectification : Mettre à jour ou corriger des informations inexactes", - "Suppression : Demander la suppression de vos données (sous réserve d'obligations légales)", - "Portabilité : Recevoir vos données dans un format lisible par machine", - "Opt-out : Retirer votre consentement aux reconnaissances publiques à tout moment", - "Opposition : Vous opposer au traitement de vos données" + "Correction : Mettre à jour ou corriger des informations inexactes", + "Suppression : Demander la suppression de vos données (sous réserve des obligations légales)", + "Portabilité : Recevez vos données dans un format lisible par une machine (JSON, CSV)", + "Opt-Out : Retirer à tout moment son consentement pour les remerciements publics", + "Objection : S'opposer au traitement de vos données" ], - "contact": "Pour exercer vos droits, envoyez un e-mail à : privacy@agenticgovernance.digital" + "contact": "Pour exercer vos droits, envoyez un courriel à l'adresse suivante : privacy@agenticgovernance.digital" }, "section_6": { - "title": "6. Cookies et suivi", - "essential": "Cookies essentiels : Requis pour la fonctionnalité du site (gestion de session, authentification)", - "preference": "Cookies de préférence : Mémorisent vos paramètres (sélection de devise, préférences de thème)", - "analytics": "Cookies analytiques : Analytique respectueuse de la confidentialité (pas de suivi intersites)", - "control": "Vous pouvez contrôler les cookies via les paramètres de votre navigateur. La désactivation des cookies peut affecter la fonctionnalité du site." + "title": "6. Cookies et traçage", + "essential": "Cookies essentiels : Nécessaires à la fonctionnalité du site (gestion de la session, authentification)", + "preference": "Cookies de préférence : Mémorisent vos paramètres (choix de la devise, préférences de thème)", + "analytics": "Cookies d'analyse : Analyse respectueuse de la vie privée (pas de suivi intersites)", + "control": "Vous pouvez contrôler les cookies par le biais des paramètres de votre navigateur. La désactivation des cookies peut affecter la fonctionnalité du site." }, "section_7": { "title": "7. Sécurité", "intro": "Nous mettons en œuvre des mesures de sécurité conformes aux normes de l'industrie :", "items": [ - "Chiffrement HTTPS pour toutes les connexions", - "Stockage de base de données chiffré", - "Hachage des mots de passe (bcrypt)", - "Audits de sécurité réguliers", - "Contrôles d'accès et surveillance", - "Pas de stockage de données de carte de paiement (géré par les systèmes conformes PCI de Stripe)" + "Cryptage TLS 1.3 pour toutes les connexions", + "Stockage crypté des bases de données (AES-256 au repos)", + "Hachage du mot de passe (bcrypt avec sel)", + "Audits de sécurité réguliers et analyse des vulnérabilités", + "Contrôles d'accès et surveillance de la détection d'intrusion", + "Pas de stockage des données relatives aux cartes de paiement (traitées par les systèmes Stripe conformes à la norme PCI)" ], - "disclaimer": "Bien que nous prenions des précautions raisonnables, aucun système n'est sûr à 100%. Signalez les problèmes de sécurité à : security@agenticgovernance.digital" + "disclaimer": "Bien que nous prenions des précautions raisonnables, aucun système n'est sûr à 100 %. Signalez les problèmes de sécurité à : security@agenticgovernance.digital" }, "section_8": { - "title": "8. Confidentialité des enfants", - "text": "Le Tractatus Framework ne s'adresse pas aux enfants de moins de 13 ans. Nous ne collectons pas sciemment d'informations sur les enfants. Si vous pensez qu'un enfant nous a fourni des données personnelles, veuillez nous contacter à privacy@agenticgovernance.digital." + "title": "8. Vie privée des enfants", + "text": "Le cadre du Tractatus ne s'adresse pas aux enfants de moins de 13 ans. Nous ne recueillons pas sciemment d'informations auprès d'enfants. Si vous pensez qu'un enfant nous a fourni des données personnelles, veuillez nous contacter à l'adresse privacy@agenticgovernance.digital." }, "section_9": { - "title": "9. Transferts internationaux de données", - "intro": "Le Tractatus Framework opère depuis la Nouvelle-Zélande. Si vous accédez à nos services depuis d'autres pays, vos données peuvent être transférées et traitées en Nouvelle-Zélande. En utilisant nos services, vous consentez à ce transfert.", - "gdpr": "Conformité RGPD : Pour les utilisateurs de l'UE, nous respectons les exigences du RGPD, y compris la base légale du traitement, la minimisation des données et vos droits en vertu des articles 15-22." + "title": "9. Localisation des données et opérations internationales", + "intro": "Le cadre Tractatus est administré depuis Aotearoa (Nouvelle-Zélande), mais notre infrastructure est hébergée par OVHCloud dans l'Union européenne (France). Vos données sont stockées et traitées au sein de l'UE, bénéficiant ainsi de normes européennes strictes en matière de protection des données.", + "gdpr": "Conformité RGPD : Pour les utilisateurs de l'UE, nous respectons les exigences du RGPD, y compris la base légale du traitement, la minimisation des données et vos droits en vertu des articles 15-22.", + "hosting_heading": "Hébergement et résidence de données :", + "hosting_items": { + "0": "Hébergement principal : OVHCloud (France, UE) - toutes les données des utilisateurs sont stockées dans la juridiction de l'UE", + "1": "Base de données : Atlas MongoDB (région UE-Ouest, Francfort, Allemagne)", + "2": "Traitement des paiements : Stripe (utilise les clauses contractuelles standard pour les transferts de données entre l'UE et les États-Unis)", + "3": "Pas de transfert de données vers la Nouvelle-Zélande : vos données à caractère personnel ne sont pas transférées ou traitées en Nouvelle-Zélande" + }, + "gdpr_heading": "Conformité au GDPR :", + "gdpr_text": "Notre infrastructure étant hébergée dans l'UE, nous bénéficions des protections du règlement général sur la protection des données (RGPD). Les données des utilisateurs de l'UE ne quittent jamais la juridiction de l'UE pendant les opérations normales. Nous nous conformons aux exigences du GDPR, notamment :", + "gdpr_items": { + "0": "Base légale du traitement (article 6)", + "1": "Minimisation des données et limitation de la finalité (article 5)", + "2": "Vos droits en vertu des articles 15 à 22 (accès, rectification, effacement, portabilité, opposition)", + "3": "Protection de la vie privée dès la conception et par défaut (article 25)", + "4": "Mesures de sécurité des données (article 32)" + }, + "non_eu_text": "Pour les utilisateurs hors UE : Vos données sont traitées dans l'UE et bénéficient des protections du GDPR, quel que soit votre lieu de résidence. Nous étendons les droits GDPR à tous les utilisateurs dans le monde entier." }, "section_10": { - "title": "10. Modifications de cette politique", - "text": "Nous pouvons mettre à jour cette politique de confidentialité de temps à autre. Les modifications seront publiées sur cette page avec une date \"Dernière mise à jour\" actualisée. Les modifications importantes seront communiquées par e-mail (pour les utilisateurs ayant fourni un e-mail) ou par un avis visible sur le site web." + "title": "10. Modifications de la présente politique", + "text": "Nous pouvons mettre à jour la présente politique de confidentialité de temps à autre. Les modifications seront publiées sur cette page avec une date de \"dernière mise à jour\". Les modifications importantes seront communiquées par courrier électronique (pour les utilisateurs ayant fourni un courrier électronique) ou par un avis bien visible sur le site web." }, "section_11": { "title": "11. Nous contacter", - "intro": "Pour les questions ou préoccupations liées à la confidentialité :", - "email": "E-mail :", + "intro": "Pour toute question ou préoccupation relative à la protection de la vie privée :", + "email": "Courriel :", "email_address": "privacy@agenticgovernance.digital", "dpo": "Délégué à la protection des données :", "dpo_name": "John Stroh", @@ -131,7 +148,7 @@ "postal_text": "Disponible sur demande" }, "te_tiriti": { - "title": "Te Tiriti o Waitangi | Engagement envers le traité", - "text": "En tant que projet basé en Nouvelle-Zélande, nous reconnaissons Te Tiriti o Waitangi et notre engagement envers le partenariat, la protection et la participation. Nos pratiques de confidentialité respectent les concepts maoris de souveraineté des données (rangatiratanga) et de tutelle collective (kaitiakitanga)." + "title": "Te Tiriti o Waitangi | Engagement du traité", + "text": "En tant que projet basé en Nouvelle-Zélande, nous reconnaissons Te Tiriti o Waitangi et notre engagement en faveur du partenariat, de la protection et de la participation. Nos pratiques en matière de protection de la vie privée respectent les concepts Māori de souveraineté des données (rangatiratanga) et de tutelle collective (kaitiakitanga)." } } diff --git a/public/privacy.html b/public/privacy.html index b0e50153..2e33c473 100644 --- a/public/privacy.html +++ b/public/privacy.html @@ -60,7 +60,7 @@
  • Donations (Koha): Name (optional), email address (required for receipt), country (optional), payment information (processed by Stripe, not stored by us)
  • Media Inquiries: Name, email, organization, inquiry details
  • Case Submissions: Contact information, case description, supporting evidence
  • -
  • Account Creation (if applicable): Email, password (hashed), optional profile information
  • +
  • Account Creation (if applicable): Email, credentials (hashed), optional profile information
  • 1.2 Automatically Collected Information

    @@ -185,7 +185,7 @@

    - While we take reasonable precautions, no system is 100% secure. Report security issues to: security@agenticgovernance.digital + While we take reasonable precautions, no system is completely secure. Report security issues to: security@agenticgovernance.digital

    @@ -198,16 +198,36 @@

    - +
    -

    9. International Data Transfers

    +

    9. Data Location and International Operations

    -

    - The Tractatus Framework operates from New Zealand. If you access our services from other countries, your data may be transferred to and processed in New Zealand. By using our services, you consent to this transfer. +

    + The Tractatus Framework is administered from Aotearoa New Zealand, but our infrastructure is hosted with OVHCloud in the European Union (France). Your data is stored and processed within the EU, benefiting from robust EU data protection standards.

    -

    - GDPR Compliance: For EU users, we comply with GDPR requirements including lawful basis for processing, data minimization, and your rights under Articles 15-22. +

    Hosting and Data Residency:

    + + +

    GDPR Compliance:

    +

    + As our infrastructure is hosted in the EU, we benefit from the protections of the General Data Protection Regulation (GDPR). EU users' data never leaves EU jurisdiction during normal operations. We comply with GDPR requirements including: +

    + + +

    + For non-EU users: Your data is processed in the EU and benefits from GDPR protections, regardless of your location. We extend GDPR rights to all users globally.

    diff --git a/scripts/translate-privacy-deepl.js b/scripts/translate-privacy-deepl.js new file mode 100755 index 00000000..5dca4385 --- /dev/null +++ b/scripts/translate-privacy-deepl.js @@ -0,0 +1,205 @@ +#!/usr/bin/env node + +/** + * Translate privacy.json from EN to DE and FR using DeepL API + * + * Usage: node scripts/translate-privacy-deepl.js [--force] + * + * Options: + * --force Overwrite existing translations + * + * Requires: DEEPL_API_KEY environment variable + */ + +require('dotenv').config(); +const fs = require('fs'); +const path = require('path'); +const https = require('https'); + +const DEEPL_API_KEY = process.env.DEEPL_API_KEY; +const API_URL = 'api.deepl.com'; // Pro API endpoint + +const FORCE = process.argv.includes('--force'); + +if (!DEEPL_API_KEY) { + console.error('❌ ERROR: DEEPL_API_KEY environment variable not set'); + console.error(' Set it with: export DEEPL_API_KEY="your-key-here"'); + process.exit(1); +} + +const EN_FILE = path.join(__dirname, '../public/locales/en/privacy.json'); +const DE_FILE = path.join(__dirname, '../public/locales/de/privacy.json'); +const FR_FILE = path.join(__dirname, '../public/locales/fr/privacy.json'); + +// Load JSON files +const enData = JSON.parse(fs.readFileSync(EN_FILE, 'utf8')); +const deData = JSON.parse(fs.readFileSync(DE_FILE, 'utf8')); +const frData = JSON.parse(fs.readFileSync(FR_FILE, 'utf8')); + +// DeepL API request function +function translateText(text, targetLang) { + return new Promise((resolve, reject) => { + const postData = new URLSearchParams({ + auth_key: DEEPL_API_KEY, + text: text, + target_lang: targetLang, + source_lang: 'EN', + formality: 'default', + preserve_formatting: '1', + tag_handling: 'html' // Preserve HTML tags + }).toString(); + + const options = { + hostname: API_URL, + port: 443, + path: '/v2/translate', + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Content-Length': Buffer.byteLength(postData) + } + }; + + const req = https.request(options, (res) => { + let data = ''; + res.on('data', (chunk) => { data += chunk; }); + res.on('end', () => { + if (res.statusCode === 200) { + try { + const response = JSON.parse(data); + resolve(response.translations[0].text); + } catch (err) { + reject(new Error(`Failed to parse response: ${err.message}`)); + } + } else { + reject(new Error(`DeepL API error: ${res.statusCode} - ${data}`)); + } + }); + }); + + req.on('error', reject); + req.write(postData); + req.end(); + }); +} + +// Helper to get nested value +function getNestedValue(obj, path) { + return path.split('.').reduce((current, key) => current?.[key], obj); +} + +// Helper to set nested value +function setNestedValue(obj, path, value) { + const keys = path.split('.'); + const lastKey = keys.pop(); + const target = keys.reduce((current, key) => { + if (!current[key]) current[key] = {}; + return current[key]; + }, obj); + target[lastKey] = value; +} + +// Recursively find all string values and their paths +function findAllStrings(obj, prefix = '') { + const strings = []; + + for (const [key, value] of Object.entries(obj)) { + const currentPath = prefix ? `${prefix}.${key}` : key; + + if (typeof value === 'string') { + strings.push(currentPath); + } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) { + strings.push(...findAllStrings(value, currentPath)); + } else if (Array.isArray(value)) { + // Handle arrays of strings + value.forEach((item, index) => { + if (typeof item === 'string') { + strings.push(`${currentPath}.${index}`); + } + }); + } + } + + return strings; +} + +// Main translation function +async function translateFile(targetLang, targetData, targetFile) { + console.log(`\n🌐 Translating to ${targetLang}...`); + + const allPaths = findAllStrings(enData); + let translatedCount = 0; + let skippedCount = 0; + let errorCount = 0; + + for (const keyPath of allPaths) { + const enValue = getNestedValue(enData, keyPath); + const existingValue = getNestedValue(targetData, keyPath); + + // Skip if already translated (not empty) unless --force flag + if (!FORCE && existingValue && existingValue.trim().length > 0 && existingValue !== enValue) { + skippedCount++; + process.stdout.write('.'); + continue; + } + + try { + // Translate + const translated = await translateText(enValue, targetLang); + setNestedValue(targetData, keyPath, translated); + translatedCount++; + process.stdout.write('✓'); + + // Rate limiting: wait 500ms between requests to avoid 429 errors + await new Promise(resolve => setTimeout(resolve, 500)); + + } catch (error) { + console.error(`\n❌ Error translating ${keyPath}:`, error.message); + errorCount++; + process.stdout.write('✗'); + } + } + + console.log(`\n\n📊 Translation Summary for ${targetLang}:`); + console.log(` ✓ Translated: ${translatedCount}`); + console.log(` . Skipped (already exists): ${skippedCount}`); + console.log(` ✗ Errors: ${errorCount}`); + + // Save updated file + fs.writeFileSync(targetFile, JSON.stringify(targetData, null, 2) + '\n', 'utf8'); + console.log(` 💾 Saved: ${targetFile}`); +} + +// Run translations +async function main() { + console.log('═══════════════════════════════════════════════════════════'); + console.log(' DeepL Translation: privacy.json (EN → DE, FR)'); + console.log('═══════════════════════════════════════════════════════════\n'); + + if (FORCE) { + console.log('⚠️ --force flag enabled: Will overwrite existing translations\n'); + } + + const totalStrings = findAllStrings(enData).length; + console.log(`📝 Total translation keys in EN file: ${totalStrings}`); + + try { + // Translate to German + await translateFile('DE', deData, DE_FILE); + + // Translate to French + await translateFile('FR', frData, FR_FILE); + + console.log('\n✅ Translation complete!'); + console.log('\n💡 Next steps:'); + console.log(' 1. Review translations in de/privacy.json and fr/privacy.json'); + console.log(' 2. Test on local server: npm start'); + console.log(' 3. Visit http://localhost:9000/privacy.html and switch languages'); + + } catch (error) { + console.error('\n❌ Fatal error:', error); + process.exit(1); + } +} + +main();