feat: lokales Google-Fonts-Hosting + "Lizenz upgraden"-button (v1.3.0)
- Lizenz-Tab: bei vollen Plaetzen erscheint ein "Lizenz upgraden"-Button (https://lucas-orth.de/wp-plugins/gdpr-content-blocker/) zusaetzlich zur domain-freigabe. - Neues Feature "Schriften": Google Fonts lokal hosten (button-modell). Admin klickt "Jetzt herunterladen & einbinden" -> plugin scannt die seiten, laedt googleapis-CSS + gstatic-schriftdateien einmalig in den uploads-ordner, schreibt die pfade lokal um und tauscht sie per output-buffer im quelltext. Abgedeckt: <link>, inline-@import/url() UND @import/url() in gleicher-origin externen CSS-dateien (mit absolutierung der restlichen relativen pfade). preconnect/dns-prefetch zu google-font-hosts werden entfernt (kein IP-leak). Toggle zum aus/einschalten + "Lokale Schriften loeschen". - i18n-pipeline robuster: build-en-mo.py nutzt jetzt translations-en.json (lookup per quell-string, reihenfolge-unabhaengig) und bricht mit liste ab, falls eine uebersetzung fehlt. Alle neuen strings DE/EN ergaenzt (139). - version 1.3.0 (header + CB_VERSION). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,133 +1,27 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Build gdpr-content-blocker-en_US.po + .mo from strings.txt (German keys in
|
||||
file order) + the EN list below (same order)."""
|
||||
import struct, sys, os
|
||||
"""Build gdpr-content-blocker-en_US.po + .mo.
|
||||
|
||||
EN = [
|
||||
"Invalid response from the license server.",
|
||||
"Insufficient permissions.",
|
||||
"Please enter a license key.",
|
||||
"License activated successfully.",
|
||||
"All seats for this license are in use. Release a domain to activate this site.",
|
||||
"Activation failed.",
|
||||
"Please select a valid domain to release.",
|
||||
"Released %s and activated this site.",
|
||||
"License is no longer valid.",
|
||||
"GDPR Content Blocker is not licensed. Protection stays active, but please add a %s for updates and support.",
|
||||
"License key",
|
||||
"Active",
|
||||
"Invalid",
|
||||
"All seats in use",
|
||||
"Not activated",
|
||||
"Status",
|
||||
"Domain",
|
||||
"Bound domains",
|
||||
"This license is already active on the following domains. Remove one to free a seat — this site will then be activated automatically.",
|
||||
"Really remove this domain from the license?",
|
||||
"Remove domain",
|
||||
"Hidden for security. To change it, deactivate first.",
|
||||
"Deactivate license",
|
||||
"Try again",
|
||||
"Activate license",
|
||||
"Recipient:",
|
||||
"Purpose:",
|
||||
"⚠ Data transfer to a third country outside the EU/EEA",
|
||||
"Provider's privacy policy",
|
||||
"Load %s now",
|
||||
"Always load this service from now on",
|
||||
"Loading this content from %s requires your consent. Personal data (e.g. your IP address) will be transmitted to the provider.",
|
||||
"Withdraw consent for external content",
|
||||
"Affects only the release of external embeds (e.g. maps, videos). Cookie settings are managed separately.",
|
||||
"Transfer to a third country outside the EU/EEA",
|
||||
"Recipient",
|
||||
"Purpose",
|
||||
"Sets cookies",
|
||||
"Yes",
|
||||
"No",
|
||||
"Privacy policy",
|
||||
"GDPR Content Blocker",
|
||||
"Really remove this service?",
|
||||
"New service",
|
||||
"Scanning website …",
|
||||
"Scan failed:",
|
||||
"No external resources found.",
|
||||
"Provider / Host",
|
||||
"Type",
|
||||
"Count",
|
||||
"Example URL",
|
||||
"Action",
|
||||
"covered",
|
||||
"third party",
|
||||
"own domain",
|
||||
"Add as service",
|
||||
"Use template",
|
||||
"Template available",
|
||||
"Scanned pages:",
|
||||
"Found on",
|
||||
"Google Ireland Ltd., Ireland / Google LLC, USA",
|
||||
"Display of interactive maps and location information.",
|
||||
"Embedding and playback of videos.",
|
||||
"OpenStreetMap Foundation, United Kingdom",
|
||||
"Display of interactive maps.",
|
||||
"Vimeo LLC, USA",
|
||||
"Settings saved.",
|
||||
"Services",
|
||||
"Scan",
|
||||
"Appearance",
|
||||
"Shortcodes",
|
||||
"License",
|
||||
"About the plugin",
|
||||
"+ Add empty service",
|
||||
"— Insert template —",
|
||||
"Save services",
|
||||
"The license server visits your website and lists all embedded third-party resources (iframes, scripts, fonts, images, …). This shows at a glance which external services you should block. Requires an active license.",
|
||||
"Scan website",
|
||||
"Save appearance",
|
||||
"Show/hide details",
|
||||
"Blocker on/off",
|
||||
"Remove service",
|
||||
"Provider name",
|
||||
"Detection pattern (domain/path)",
|
||||
"Recipient (incl. country)",
|
||||
"Provider's privacy policy URL",
|
||||
"Processing purpose",
|
||||
"Custom placeholder text (empty = default)",
|
||||
"Data transfer to a third country (outside EU/EEA)",
|
||||
"Loads external scripts",
|
||||
"Placeholder text color",
|
||||
"Placeholder background color",
|
||||
"Button: background color",
|
||||
"Button: text color",
|
||||
"Button hover: background color",
|
||||
"Button hover: text color",
|
||||
"Custom CSS",
|
||||
"Loaded after the CSS variables and can override them. Tip: use the same prefix, e.g. .cb-blocker .cb-blocker__button { … }",
|
||||
"CSS classes:",
|
||||
"Withdrawal (privacy policy)",
|
||||
"Renders a clearly visible link that withdraws consent for external embeds and reloads the page (Art. 7(3) GDPR). Does NOT affect the cookie consent of a separate cookie plugin. Options: text=\"…\", style=\"link|button\", note=\"yes|no\".",
|
||||
"Block content manually",
|
||||
"Wraps an iframe and replaces it with the placeholder of the given service. The ID is the provider name in lowercase with hyphens (e.g. \"Google Maps\" → google-maps).",
|
||||
"Services overview (privacy policy)",
|
||||
"Lists all configured services with recipient, third-country note, purpose and privacy link. Ideal for inclusion in your privacy policy (Art. 13 GDPR).",
|
||||
"Version %s",
|
||||
"GDPR Content Blocker loads external embeds (e.g. Google Maps, YouTube, OpenStreetMap, Vimeo) only after the visitor actively consents. Before the click no connection to the third party is made — so no personal data (e.g. the IP address) is transmitted. This lets you embed external content in a GDPR-compliant way without a heavy consent tool.",
|
||||
"Features",
|
||||
"True click-to-load (no preloaded iframe)",
|
||||
"Granular consent per service",
|
||||
"Art.-13-compliant placeholder with recipient, purpose, third-country note and privacy link",
|
||||
"Easy withdrawal via shortcode (Art. 7(3) GDPR)",
|
||||
"Automatic detection of common providers + manual shortcode",
|
||||
"Legal",
|
||||
"Imprint",
|
||||
"Privacy policy",
|
||||
"Note: This plugin is a technical tool and does not constitute legal advice. The site operator is responsible for the legally compliant configuration (recipients, purposes, privacy policy).",
|
||||
"Developed by %s",
|
||||
"Please activate a license first (\"License\" tab).",
|
||||
"Unexpected response from the license server.",
|
||||
]
|
||||
Robust and order-independent: every German source string (extracted into
|
||||
hilfsdaten/strings.txt) is looked up in hilfsdaten/translations-en.json.
|
||||
Adding a new __() string to the plugin only requires adding one key/value to
|
||||
that JSON file — order does not matter. The build FAILS (and lists them) if any
|
||||
extracted string has no translation.
|
||||
|
||||
Usage: python hilfsdaten/extract-strings.py gdpr-content-blocker hilfsdaten/strings.txt
|
||||
python hilfsdaten/build-en-mo.py .
|
||||
"""
|
||||
import json
|
||||
import os
|
||||
import struct
|
||||
import sys
|
||||
|
||||
base = sys.argv[1] if len(sys.argv) > 1 else '.'
|
||||
here = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
with open(os.path.join(here, 'translations-en.json'), encoding='utf-8') as f:
|
||||
TRANSLATIONS = json.load(f)
|
||||
|
||||
base = sys.argv[1]
|
||||
strings_file = os.path.join(base, 'hilfsdaten', 'strings.txt')
|
||||
de = []
|
||||
with open(strings_file, encoding='utf-8') as f:
|
||||
@@ -135,48 +29,65 @@ with open(strings_file, encoding='utf-8') as f:
|
||||
if line.startswith('MSGID\t'):
|
||||
de.append(line[len('MSGID\t'):].rstrip('\n'))
|
||||
|
||||
if len(de) != len(EN):
|
||||
print(f"MISMATCH: {len(de)} German vs {len(EN)} English"); sys.exit(1)
|
||||
missing = [s for s in de if s not in TRANSLATIONS]
|
||||
if missing:
|
||||
print('MISSING %d translation(s) — add them to hilfsdaten/translations-en.json:' % len(missing))
|
||||
for m in missing:
|
||||
print(' ' + json.dumps(m, ensure_ascii=False))
|
||||
sys.exit(1)
|
||||
|
||||
header = (
|
||||
'Project-Id-Version: GDPR Content Blocker\n'
|
||||
'MIME-Version: 1.0\n'
|
||||
'Content-Type: text/plain; charset=UTF-8\n'
|
||||
'Content-Transfer-Encoding: 8bit\n'
|
||||
'Language: en_US\n'
|
||||
)
|
||||
|
||||
header = ("Project-Id-Version: GDPR Content Blocker\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: en_US\n")
|
||||
entries = {'': header}
|
||||
for d, e in zip(de, EN):
|
||||
entries[d] = e
|
||||
for s in de:
|
||||
entries[s] = TRANSLATIONS[s]
|
||||
|
||||
|
||||
def po_escape(s):
|
||||
return s.replace('\\', '\\\\').replace('"', '\\"').replace('\n', '\\n')
|
||||
|
||||
|
||||
po_path = os.path.join(base, 'gdpr-content-blocker', 'languages', 'gdpr-content-blocker-en_US.po')
|
||||
with open(po_path, 'w', encoding='utf-8') as f:
|
||||
f.write('msgid ""\nmsgstr ""\n')
|
||||
for line in header.rstrip('\n').split('\n'):
|
||||
f.write('"%s\\n"\n' % po_escape(line))
|
||||
f.write('\n')
|
||||
for d, e in zip(de, EN):
|
||||
f.write('msgid "%s"\n' % po_escape(d))
|
||||
f.write('msgstr "%s"\n\n' % po_escape(e))
|
||||
for s in de:
|
||||
f.write('msgid "%s"\n' % po_escape(s))
|
||||
f.write('msgstr "%s"\n\n' % po_escape(TRANSLATIONS[s]))
|
||||
|
||||
|
||||
def write_mo(entries, out):
|
||||
keys = sorted(entries.keys())
|
||||
ids = b''; strs = b''; offsets = []
|
||||
ids = b''
|
||||
strs = b''
|
||||
offsets = []
|
||||
for k in keys:
|
||||
kb = k.encode('utf-8'); vb = entries[k].encode('utf-8')
|
||||
kb = k.encode('utf-8')
|
||||
vb = entries[k].encode('utf-8')
|
||||
offsets.append((len(ids), len(kb), len(strs), len(vb)))
|
||||
ids += kb + b'\x00'; strs += vb + b'\x00'
|
||||
ids += kb + b'\x00'
|
||||
strs += vb + b'\x00'
|
||||
keystart = 7 * 4 + 16 * len(keys)
|
||||
valuestart = keystart + len(ids)
|
||||
ko = []; vo = []
|
||||
ko = []
|
||||
vo = []
|
||||
for o1, l1, o2, l2 in offsets:
|
||||
ko += [l1, o1 + keystart]; vo += [l2, o2 + valuestart]
|
||||
out_b = struct.pack("Iiiiiii", 0x950412de, 0, len(keys), 7 * 4, 7 * 4 + len(keys) * 8, 0, 0)
|
||||
out_b += struct.pack("i" * len(ko), *ko) + struct.pack("i" * len(vo), *vo) + ids + strs
|
||||
ko += [l1, o1 + keystart]
|
||||
vo += [l2, o2 + valuestart]
|
||||
out_b = struct.pack('Iiiiiii', 0x950412de, 0, len(keys), 7 * 4, 7 * 4 + len(keys) * 8, 0, 0)
|
||||
out_b += struct.pack('i' * len(ko), *ko) + struct.pack('i' * len(vo), *vo) + ids + strs
|
||||
with open(out, 'wb') as f:
|
||||
f.write(out_b)
|
||||
|
||||
|
||||
mo_path = os.path.join(base, 'gdpr-content-blocker', 'languages', 'gdpr-content-blocker-en_US.mo')
|
||||
write_mo(entries, mo_path)
|
||||
print(f"OK: {len(de)} strings -> {os.path.basename(po_path)} + .mo")
|
||||
print('OK: %d strings -> %s + .mo' % (len(de), os.path.basename(po_path)))
|
||||
|
||||
140
hilfsdaten/strings.txt
Normal file
140
hilfsdaten/strings.txt
Normal file
@@ -0,0 +1,140 @@
|
||||
# 139 unique strings
|
||||
MSGID Keine Berechtigung.
|
||||
MSGID Lokale Schriften gelöscht.
|
||||
MSGID Upload-Verzeichnis konnte nicht erstellt werden.
|
||||
MSGID %1$d Schrift-Stylesheet(s) und %2$d Schriftdatei(en) lokal gespeichert.
|
||||
MSGID Bindet Google Fonts lokal ein: Das Plugin lädt die Schrift-Stylesheets und Schriftdateien einmalig herunter, speichert sie in Ihrem Uploads-Ordner und ersetzt die Pfade im Seitenquelltext. So wird beim Seitenaufruf keine Verbindung mehr zu Google aufgebaut (kein IP-Transfer) und die Schriften laden schneller.
|
||||
MSGID Lokales Hosting
|
||||
MSGID Lokale Schriften ein/aus
|
||||
MSGID Wenn aktiv, werden auf der Webseite die heruntergeladenen lokalen Schriften statt der Google-Pfade ausgeliefert.
|
||||
MSGID Speichern
|
||||
MSGID Schriften herunterladen
|
||||
MSGID Jetzt herunterladen & einbinden
|
||||
MSGID Lokale Schriften löschen
|
||||
MSGID Aktuell lokal: %1$d Stylesheet(s), %2$d Schriftdatei(en) – zuletzt aktualisiert am %3$s.
|
||||
MSGID Hinweis: Gescannt werden die Startseite und einige Unterseiten. Falls auf einzelnen Seiten weitere Google Fonts vorkommen, führen Sie die Aktion nach Inhaltsänderungen erneut aus.
|
||||
MSGID Ungültige Antwort vom Lizenzserver.
|
||||
MSGID Bitte einen Lizenzschlüssel eingeben.
|
||||
MSGID Lizenz erfolgreich aktiviert.
|
||||
MSGID Alle Plätze dieser Lizenz sind belegt. Geben Sie eine Domain frei, um diese Seite zu aktivieren.
|
||||
MSGID Aktivierung fehlgeschlagen.
|
||||
MSGID Bitte eine gültige Domain zum Freigeben auswählen.
|
||||
MSGID Domain %s freigegeben und diese Seite aktiviert.
|
||||
MSGID Lizenz nicht mehr gültig.
|
||||
MSGID GDPR Content Blocker ist nicht lizenziert. Der Schutz bleibt aktiv, aber für Updates und Support bitte %s hinterlegen.
|
||||
MSGID Lizenzschlüssel
|
||||
MSGID Aktiv
|
||||
MSGID Ungültig
|
||||
MSGID Alle Plätze belegt
|
||||
MSGID Nicht aktiviert
|
||||
MSGID Status
|
||||
MSGID Domain
|
||||
MSGID Lizenz upgraden
|
||||
MSGID Schalten Sie weitere Domains frei, um diese Seite zusätzlich zu aktivieren – oder geben Sie unten eine bestehende Domain frei.
|
||||
MSGID Belegte Domains
|
||||
MSGID Diese Lizenz ist bereits auf folgenden Domains aktiv. Entfernen Sie eine, um den Platz freizugeben – diese Seite wird anschließend automatisch aktiviert.
|
||||
MSGID Diese Domain wirklich aus der Lizenz entfernen?
|
||||
MSGID Domain entfernen
|
||||
MSGID Aus Sicherheitsgründen verdeckt. Zum Ändern bitte zuerst deaktivieren.
|
||||
MSGID Lizenz deaktivieren
|
||||
MSGID Erneut versuchen
|
||||
MSGID Lizenz aktivieren
|
||||
MSGID Empfänger:
|
||||
MSGID Zweck:
|
||||
MSGID ⚠ Datenübermittlung in ein Drittland außerhalb der EU/des EWR
|
||||
MSGID Datenschutzerklärung des Anbieters
|
||||
MSGID %s jetzt laden
|
||||
MSGID Diesen Dienst künftig immer laden
|
||||
MSGID Um diesen Inhalt von %s zu laden, ist Ihre Einwilligung erforderlich. Dabei werden personenbezogene Daten (z. B. Ihre IP-Adresse) an den Anbieter übertragen.
|
||||
MSGID Einwilligung für externe Inhalte widerrufen
|
||||
MSGID Betrifft nur die Freigabe externer Einbettungen (z. B. Karten, Videos). Cookie-Einstellungen werden separat verwaltet.
|
||||
MSGID Übermittlung in ein Drittland außerhalb der EU/des EWR
|
||||
MSGID Empfänger
|
||||
MSGID Zweck
|
||||
MSGID Setzt Cookies
|
||||
MSGID Ja
|
||||
MSGID Nein
|
||||
MSGID Datenschutz
|
||||
MSGID GDPR Content Blocker
|
||||
MSGID Dienst wirklich entfernen?
|
||||
MSGID Neuer Dienst
|
||||
MSGID Scanne Webseite …
|
||||
MSGID Scan fehlgeschlagen:
|
||||
MSGID Keine externen Einbindungen gefunden.
|
||||
MSGID Anbieter / Host
|
||||
MSGID Typ
|
||||
MSGID Anzahl
|
||||
MSGID Beispiel-URL
|
||||
MSGID Aktion
|
||||
MSGID abgedeckt
|
||||
MSGID Drittanbieter
|
||||
MSGID eigene Domain
|
||||
MSGID Als Dienst übernehmen
|
||||
MSGID Vorlage übernehmen
|
||||
MSGID Vorlage verfügbar
|
||||
MSGID Gescannte Seiten:
|
||||
MSGID Gefunden auf
|
||||
MSGID Schriften werden heruntergeladen …
|
||||
MSGID Fehler beim Herunterladen:
|
||||
MSGID Lokale Schriften wirklich löschen?
|
||||
MSGID Google Ireland Ltd., Irland / Google LLC, USA
|
||||
MSGID Darstellung interaktiver Karten und Standortinformationen.
|
||||
MSGID Einbettung und Wiedergabe von Videos.
|
||||
MSGID OpenStreetMap Foundation, Großbritannien
|
||||
MSGID Darstellung interaktiver Karten.
|
||||
MSGID Vimeo LLC, USA
|
||||
MSGID Einstellungen gespeichert.
|
||||
MSGID Dienste
|
||||
MSGID Scan
|
||||
MSGID Darstellung
|
||||
MSGID Schriften
|
||||
MSGID Shortcodes
|
||||
MSGID Lizenz
|
||||
MSGID Über das Plugin
|
||||
MSGID + Leeren Dienst hinzufügen
|
||||
MSGID — Vorlage einfügen —
|
||||
MSGID Dienste speichern
|
||||
MSGID Der Lizenzserver besucht Ihre Webseite und listet alle eingebundenen Drittanbieter-Ressourcen (iframes, Skripte, Schriften, Bilder, …) auf. So sehen Sie auf einen Blick, welche externen Dienste Sie blockieren sollten. Erfordert eine aktive Lizenz.
|
||||
MSGID Webseite scannen
|
||||
MSGID Darstellung speichern
|
||||
MSGID Details anzeigen/ausblenden
|
||||
MSGID Blocker aktiv/inaktiv
|
||||
MSGID Dienst entfernen
|
||||
MSGID Anbietername
|
||||
MSGID Erkennungsmuster (Domain/Pfad)
|
||||
MSGID Empfänger (inkl. Land)
|
||||
MSGID Datenschutz-URL des Anbieters
|
||||
MSGID Verarbeitungszweck
|
||||
MSGID Individueller Platzhaltertext (leer = Standard)
|
||||
MSGID Datenübermittlung in Drittland (außerhalb EU/EWR)
|
||||
MSGID Lädt externe Skripte
|
||||
MSGID Textfarbe Platzhalter
|
||||
MSGID Hintergrundfarbe Platzhalter
|
||||
MSGID Button: Hintergrundfarbe
|
||||
MSGID Button: Textfarbe
|
||||
MSGID Button Hover: Hintergrundfarbe
|
||||
MSGID Button Hover: Textfarbe
|
||||
MSGID Custom CSS
|
||||
MSGID Wird nach den CSS-Variablen eingebunden und kann diese überschreiben. Tipp: denselben Präfix verwenden, z. B. .cb-blocker .cb-blocker__button { … }
|
||||
MSGID CSS-Klassen:
|
||||
MSGID Widerruf (Datenschutzerklärung)
|
||||
MSGID Rendert einen gut sichtbaren Link, der die Einwilligung für externe Einbettungen widerruft und die Seite neu lädt (Art. 7 Abs. 3 DSGVO). Betrifft NICHT die Cookie-Einwilligung eines separaten Cookie-Plugins. Optionen: text="…", style="link|button", note="yes|no".
|
||||
MSGID Inhalt manuell blockieren
|
||||
MSGID Umschließt ein iframe und ersetzt es durch den Platzhalter des angegebenen Dienstes. Die ID ist der Anbietername in Kleinbuchstaben mit Bindestrichen (z. B. „Google Maps" → google-maps).
|
||||
MSGID Dienste-Übersicht (Datenschutzerklärung)
|
||||
MSGID Listet alle konfigurierten Dienste mit Empfänger, Drittland-Hinweis, Zweck und Datenschutz-Link auf. Ideal zum Einbinden in die Datenschutzerklärung (Art. 13 DSGVO).
|
||||
MSGID Version %s
|
||||
MSGID GDPR Content Blocker lädt externe Einbindungen (z. B. Google Maps, YouTube, OpenStreetMap, Vimeo) erst nach aktiver Einwilligung der Besucher. Vor dem Klick wird keine Verbindung zum Drittanbieter aufgebaut – es werden also keine personenbezogenen Daten (z. B. die IP-Adresse) übertragen. So lassen sich externe Inhalte DSGVO-konform einbinden, ohne ein schweres Consent-Tool.
|
||||
MSGID Funktionen
|
||||
MSGID Echtes Click-to-Load (kein vorab geladenes iframe)
|
||||
MSGID Granulare Einwilligung pro Dienst
|
||||
MSGID Art.-13-konformer Platzhalter mit Empfänger, Zweck, Drittland-Hinweis und Datenschutz-Link
|
||||
MSGID Einfacher Widerruf per Shortcode (Art. 7 Abs. 3 DSGVO)
|
||||
MSGID Automatische Erkennung gängiger Anbieter + manueller Shortcode
|
||||
MSGID Rechtliches
|
||||
MSGID Impressum
|
||||
MSGID Datenschutzerklärung
|
||||
MSGID Hinweis: Dieses Plugin ist ein technisches Hilfsmittel und ersetzt keine Rechtsberatung. Für die rechtskonforme Konfiguration (Empfänger, Zwecke, Datenschutzerklärung) ist der Seitenbetreiber verantwortlich.
|
||||
MSGID Entwickelt von %s
|
||||
MSGID Bitte zuerst eine Lizenz aktivieren (Tab „Lizenz").
|
||||
MSGID Unerwartete Antwort vom Lizenzserver.
|
||||
141
hilfsdaten/translations-en.json
Normal file
141
hilfsdaten/translations-en.json
Normal file
@@ -0,0 +1,141 @@
|
||||
{
|
||||
"Ungültige Antwort vom Lizenzserver.": "Invalid response from the license server.",
|
||||
"Keine Berechtigung.": "Insufficient permissions.",
|
||||
"Bitte einen Lizenzschlüssel eingeben.": "Please enter a license key.",
|
||||
"Lizenz erfolgreich aktiviert.": "License activated successfully.",
|
||||
"Alle Plätze dieser Lizenz sind belegt. Geben Sie eine Domain frei, um diese Seite zu aktivieren.": "All seats for this license are in use. Release a domain to activate this site.",
|
||||
"Aktivierung fehlgeschlagen.": "Activation failed.",
|
||||
"Bitte eine gültige Domain zum Freigeben auswählen.": "Please select a valid domain to release.",
|
||||
"Domain %s freigegeben und diese Seite aktiviert.": "Released %s and activated this site.",
|
||||
"Lizenz nicht mehr gültig.": "License is no longer valid.",
|
||||
"GDPR Content Blocker ist nicht lizenziert. Der Schutz bleibt aktiv, aber für Updates und Support bitte %s hinterlegen.": "GDPR Content Blocker is not licensed. Protection stays active, but please add a %s for updates and support.",
|
||||
"Lizenzschlüssel": "License key",
|
||||
"Aktiv": "Active",
|
||||
"Ungültig": "Invalid",
|
||||
"Alle Plätze belegt": "All seats in use",
|
||||
"Nicht aktiviert": "Not activated",
|
||||
"Status": "Status",
|
||||
"Domain": "Domain",
|
||||
"Belegte Domains": "Bound domains",
|
||||
"Diese Lizenz ist bereits auf folgenden Domains aktiv. Entfernen Sie eine, um den Platz freizugeben – diese Seite wird anschließend automatisch aktiviert.": "This license is already active on the following domains. Remove one to free a seat — this site will then be activated automatically.",
|
||||
"Diese Domain wirklich aus der Lizenz entfernen?": "Really remove this domain from the license?",
|
||||
"Domain entfernen": "Remove domain",
|
||||
"Aus Sicherheitsgründen verdeckt. Zum Ändern bitte zuerst deaktivieren.": "Hidden for security. To change it, deactivate first.",
|
||||
"Lizenz deaktivieren": "Deactivate license",
|
||||
"Erneut versuchen": "Try again",
|
||||
"Lizenz aktivieren": "Activate license",
|
||||
"Empfänger:": "Recipient:",
|
||||
"Zweck:": "Purpose:",
|
||||
"⚠ Datenübermittlung in ein Drittland außerhalb der EU/des EWR": "⚠ Data transfer to a third country outside the EU/EEA",
|
||||
"Datenschutzerklärung des Anbieters": "Provider's privacy policy",
|
||||
"%s jetzt laden": "Load %s now",
|
||||
"Diesen Dienst künftig immer laden": "Always load this service from now on",
|
||||
"Um diesen Inhalt von %s zu laden, ist Ihre Einwilligung erforderlich. Dabei werden personenbezogene Daten (z. B. Ihre IP-Adresse) an den Anbieter übertragen.": "Loading this content from %s requires your consent. Personal data (e.g. your IP address) will be transmitted to the provider.",
|
||||
"Einwilligung für externe Inhalte widerrufen": "Withdraw consent for external content",
|
||||
"Betrifft nur die Freigabe externer Einbettungen (z. B. Karten, Videos). Cookie-Einstellungen werden separat verwaltet.": "Affects only the release of external embeds (e.g. maps, videos). Cookie settings are managed separately.",
|
||||
"Übermittlung in ein Drittland außerhalb der EU/des EWR": "Transfer to a third country outside the EU/EEA",
|
||||
"Empfänger": "Recipient",
|
||||
"Zweck": "Purpose",
|
||||
"Setzt Cookies": "Sets cookies",
|
||||
"Ja": "Yes",
|
||||
"Nein": "No",
|
||||
"Datenschutz": "Privacy policy",
|
||||
"GDPR Content Blocker": "GDPR Content Blocker",
|
||||
"Dienst wirklich entfernen?": "Really remove this service?",
|
||||
"Neuer Dienst": "New service",
|
||||
"Scanne Webseite …": "Scanning website …",
|
||||
"Scan fehlgeschlagen:": "Scan failed:",
|
||||
"Keine externen Einbindungen gefunden.": "No external resources found.",
|
||||
"Anbieter / Host": "Provider / Host",
|
||||
"Typ": "Type",
|
||||
"Anzahl": "Count",
|
||||
"Beispiel-URL": "Example URL",
|
||||
"Aktion": "Action",
|
||||
"abgedeckt": "covered",
|
||||
"Drittanbieter": "third party",
|
||||
"eigene Domain": "own domain",
|
||||
"Als Dienst übernehmen": "Add as service",
|
||||
"Vorlage übernehmen": "Use template",
|
||||
"Vorlage verfügbar": "Template available",
|
||||
"Gescannte Seiten:": "Scanned pages:",
|
||||
"Gefunden auf": "Found on",
|
||||
"Google Ireland Ltd., Irland / Google LLC, USA": "Google Ireland Ltd., Ireland / Google LLC, USA",
|
||||
"Darstellung interaktiver Karten und Standortinformationen.": "Display of interactive maps and location information.",
|
||||
"Einbettung und Wiedergabe von Videos.": "Embedding and playback of videos.",
|
||||
"OpenStreetMap Foundation, Großbritannien": "OpenStreetMap Foundation, United Kingdom",
|
||||
"Darstellung interaktiver Karten.": "Display of interactive maps.",
|
||||
"Vimeo LLC, USA": "Vimeo LLC, USA",
|
||||
"Einstellungen gespeichert.": "Settings saved.",
|
||||
"Dienste": "Services",
|
||||
"Scan": "Scan",
|
||||
"Darstellung": "Appearance",
|
||||
"Shortcodes": "Shortcodes",
|
||||
"Lizenz": "License",
|
||||
"Über das Plugin": "About the plugin",
|
||||
"+ Leeren Dienst hinzufügen": "+ Add empty service",
|
||||
"— Vorlage einfügen —": "— Insert template —",
|
||||
"Dienste speichern": "Save services",
|
||||
"Der Lizenzserver besucht Ihre Webseite und listet alle eingebundenen Drittanbieter-Ressourcen (iframes, Skripte, Schriften, Bilder, …) auf. So sehen Sie auf einen Blick, welche externen Dienste Sie blockieren sollten. Erfordert eine aktive Lizenz.": "The license server visits your website and lists all embedded third-party resources (iframes, scripts, fonts, images, …). This shows at a glance which external services you should block. Requires an active license.",
|
||||
"Webseite scannen": "Scan website",
|
||||
"Darstellung speichern": "Save appearance",
|
||||
"Details anzeigen/ausblenden": "Show/hide details",
|
||||
"Blocker aktiv/inaktiv": "Blocker on/off",
|
||||
"Dienst entfernen": "Remove service",
|
||||
"Anbietername": "Provider name",
|
||||
"Erkennungsmuster (Domain/Pfad)": "Detection pattern (domain/path)",
|
||||
"Empfänger (inkl. Land)": "Recipient (incl. country)",
|
||||
"Datenschutz-URL des Anbieters": "Provider's privacy policy URL",
|
||||
"Verarbeitungszweck": "Processing purpose",
|
||||
"Individueller Platzhaltertext (leer = Standard)": "Custom placeholder text (empty = default)",
|
||||
"Datenübermittlung in Drittland (außerhalb EU/EWR)": "Data transfer to a third country (outside EU/EEA)",
|
||||
"Lädt externe Skripte": "Loads external scripts",
|
||||
"Textfarbe Platzhalter": "Placeholder text color",
|
||||
"Hintergrundfarbe Platzhalter": "Placeholder background color",
|
||||
"Button: Hintergrundfarbe": "Button: background color",
|
||||
"Button: Textfarbe": "Button: text color",
|
||||
"Button Hover: Hintergrundfarbe": "Button hover: background color",
|
||||
"Button Hover: Textfarbe": "Button hover: text color",
|
||||
"Custom CSS": "Custom CSS",
|
||||
"Wird nach den CSS-Variablen eingebunden und kann diese überschreiben. Tipp: denselben Präfix verwenden, z. B. .cb-blocker .cb-blocker__button { … }": "Loaded after the CSS variables and can override them. Tip: use the same prefix, e.g. .cb-blocker .cb-blocker__button { … }",
|
||||
"CSS-Klassen:": "CSS classes:",
|
||||
"Widerruf (Datenschutzerklärung)": "Withdrawal (privacy policy)",
|
||||
"Rendert einen gut sichtbaren Link, der die Einwilligung für externe Einbettungen widerruft und die Seite neu lädt (Art. 7 Abs. 3 DSGVO). Betrifft NICHT die Cookie-Einwilligung eines separaten Cookie-Plugins. Optionen: text=\"…\", style=\"link|button\", note=\"yes|no\".": "Renders a clearly visible link that withdraws consent for external embeds and reloads the page (Art. 7(3) GDPR). Does NOT affect the cookie consent of a separate cookie plugin. Options: text=\"…\", style=\"link|button\", note=\"yes|no\".",
|
||||
"Inhalt manuell blockieren": "Block content manually",
|
||||
"Umschließt ein iframe und ersetzt es durch den Platzhalter des angegebenen Dienstes. Die ID ist der Anbietername in Kleinbuchstaben mit Bindestrichen (z. B. „Google Maps\" → google-maps).": "Wraps an iframe and replaces it with the placeholder of the given service. The ID is the provider name in lowercase with hyphens (e.g. \"Google Maps\" → google-maps).",
|
||||
"Dienste-Übersicht (Datenschutzerklärung)": "Services overview (privacy policy)",
|
||||
"Listet alle konfigurierten Dienste mit Empfänger, Drittland-Hinweis, Zweck und Datenschutz-Link auf. Ideal zum Einbinden in die Datenschutzerklärung (Art. 13 DSGVO).": "Lists all configured services with recipient, third-country note, purpose and privacy link. Ideal for inclusion in your privacy policy (Art. 13 GDPR).",
|
||||
"Version %s": "Version %s",
|
||||
"GDPR Content Blocker lädt externe Einbindungen (z. B. Google Maps, YouTube, OpenStreetMap, Vimeo) erst nach aktiver Einwilligung der Besucher. Vor dem Klick wird keine Verbindung zum Drittanbieter aufgebaut – es werden also keine personenbezogenen Daten (z. B. die IP-Adresse) übertragen. So lassen sich externe Inhalte DSGVO-konform einbinden, ohne ein schweres Consent-Tool.": "GDPR Content Blocker loads external embeds (e.g. Google Maps, YouTube, OpenStreetMap, Vimeo) only after the visitor actively consents. Before the click no connection to the third party is made — so no personal data (e.g. the IP address) is transmitted. This lets you embed external content in a GDPR-compliant way without a heavy consent tool.",
|
||||
"Funktionen": "Features",
|
||||
"Echtes Click-to-Load (kein vorab geladenes iframe)": "True click-to-load (no preloaded iframe)",
|
||||
"Granulare Einwilligung pro Dienst": "Granular consent per service",
|
||||
"Art.-13-konformer Platzhalter mit Empfänger, Zweck, Drittland-Hinweis und Datenschutz-Link": "Art.-13-compliant placeholder with recipient, purpose, third-country note and privacy link",
|
||||
"Einfacher Widerruf per Shortcode (Art. 7 Abs. 3 DSGVO)": "Easy withdrawal via shortcode (Art. 7(3) GDPR)",
|
||||
"Automatische Erkennung gängiger Anbieter + manueller Shortcode": "Automatic detection of common providers + manual shortcode",
|
||||
"Rechtliches": "Legal",
|
||||
"Impressum": "Imprint",
|
||||
"Datenschutzerklärung": "Privacy policy",
|
||||
"Hinweis: Dieses Plugin ist ein technisches Hilfsmittel und ersetzt keine Rechtsberatung. Für die rechtskonforme Konfiguration (Empfänger, Zwecke, Datenschutzerklärung) ist der Seitenbetreiber verantwortlich.": "Note: This plugin is a technical tool and does not constitute legal advice. The site operator is responsible for the legally compliant configuration (recipients, purposes, privacy policy).",
|
||||
"Entwickelt von %s": "Developed by %s",
|
||||
"Bitte zuerst eine Lizenz aktivieren (Tab „Lizenz\").": "Please activate a license first (\"License\" tab).",
|
||||
"Unerwartete Antwort vom Lizenzserver.": "Unexpected response from the license server.",
|
||||
"Lizenz upgraden": "Upgrade license",
|
||||
"Schalten Sie weitere Domains frei, um diese Seite zusätzlich zu aktivieren – oder geben Sie unten eine bestehende Domain frei.": "Unlock more domains to additionally activate this site — or release an existing domain below.",
|
||||
"Schriften": "Fonts",
|
||||
"Schriften werden heruntergeladen …": "Downloading fonts …",
|
||||
"Fehler beim Herunterladen:": "Download error:",
|
||||
"Lokale Schriften wirklich löschen?": "Really delete the local fonts?",
|
||||
"Upload-Verzeichnis konnte nicht erstellt werden.": "The upload directory could not be created.",
|
||||
"Lokale Schriften gelöscht.": "Local fonts deleted.",
|
||||
"%1$d Schrift-Stylesheet(s) und %2$d Schriftdatei(en) lokal gespeichert.": "%1$d font stylesheet(s) and %2$d font file(s) stored locally.",
|
||||
"Bindet Google Fonts lokal ein: Das Plugin lädt die Schrift-Stylesheets und Schriftdateien einmalig herunter, speichert sie in Ihrem Uploads-Ordner und ersetzt die Pfade im Seitenquelltext. So wird beim Seitenaufruf keine Verbindung mehr zu Google aufgebaut (kein IP-Transfer) und die Schriften laden schneller.": "Hosts Google Fonts locally: the plugin downloads the font stylesheets and font files once, stores them in your uploads folder and replaces the paths in the page source. As a result no connection to Google is made on page load (no IP transfer) and fonts load faster.",
|
||||
"Lokales Hosting": "Local hosting",
|
||||
"Lokale Schriften ein/aus": "Local fonts on/off",
|
||||
"Wenn aktiv, werden auf der Webseite die heruntergeladenen lokalen Schriften statt der Google-Pfade ausgeliefert.": "When enabled, the website serves the downloaded local fonts instead of the Google paths.",
|
||||
"Speichern": "Save",
|
||||
"Schriften herunterladen": "Download fonts",
|
||||
"Jetzt herunterladen & einbinden": "Download & embed now",
|
||||
"Lokale Schriften löschen": "Delete local fonts",
|
||||
"Aktuell lokal: %1$d Stylesheet(s), %2$d Schriftdatei(en) – zuletzt aktualisiert am %3$s.": "Currently local: %1$d stylesheet(s), %2$d font file(s) — last updated on %3$s.",
|
||||
"Hinweis: Gescannt werden die Startseite und einige Unterseiten. Falls auf einzelnen Seiten weitere Google Fonts vorkommen, führen Sie die Aktion nach Inhaltsänderungen erneut aus.": "Note: the home page and a few sub-pages are scanned. If individual pages contain additional Google Fonts, run the action again after content changes."
|
||||
}
|
||||
Reference in New Issue
Block a user