feat: pfeile statt +/-, shortcodes-tab, funktionen aus darstellung entfernt

- Ein-/Ausklappen wieder mit schwarzem Pfeil (>/v) ohne Box.
- Neuer Tab Shortcodes; Darstellung listet keine Funktionen mehr.
- CSS-Klassen-Referenz in den Darstellung-Tab (unter Custom CSS) verschoben.
- EN-Uebersetzung (121 Strings) neu gebaut.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
s4luorth
2026-06-07 15:22:20 +02:00
parent a738841d60
commit 4f0f8ea170
5 changed files with 78 additions and 116 deletions

View File

@@ -29,6 +29,13 @@ EN = [
"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",
@@ -38,13 +45,6 @@ EN = [
"Yes",
"No",
"Privacy policy",
"Loading this content from %s requires your consent. Personal data (e.g. your IP address) will be transmitted to the provider.",
"⚠ Data transfer to a third country outside the EU/EEA",
"Provider's privacy policy",
"Recipient:",
"Purpose:",
"Load %s now",
"Always load this service from now on",
"GDPR Content Blocker",
"Really remove this service?",
"New service",
@@ -74,6 +74,7 @@ EN = [
"Services",
"Scan",
"Appearance",
"Shortcodes",
"License",
"About the plugin",
"+ Add empty service",
@@ -103,19 +104,13 @@ EN = [
"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 { … }",
"Features & shortcodes",
"Withdrawal link (required in the 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\". Add it to your privacy policy.",
"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. Use the internal name from the \"Services\" tab. Ideal for content that isn't detected automatically (e.g. iframes loaded via JavaScript).",
"Services overview (for the privacy policy)",
"Wraps an iframe and replaces it with the placeholder of the given service. Use the internal name from the \"Services\" tab.",
"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).",
"Automatic detection",
"iframes in the server HTML whose URL matches a service's \"detection pattern\" are blocked automatically. Works only for static HTML — for JS-injected iframes use the shortcode above.",
"Website scan",
"In the \"Scan\" tab the license server lists all embedded third parties. Requires an active license.",
"CSS classes",
"Write your own rules in Custom CSS with the .cb-blocker prefix so they override the theme.",
"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",
@@ -144,20 +139,18 @@ with open(strings_file, encoding='utf-8') as f:
if len(de) != len(EN):
print(f"MISMATCH: {len(de)} German vs {len(EN)} English"); sys.exit(1)
entries = {}
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
entries = {'': header}
for d, e in zip(de, EN):
entries[d] = e
def po_escape(s):
return s.replace('\\', '\\\\').replace('"', '\\"').replace('\n', '\\n')
# write .po
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')
@@ -168,7 +161,6 @@ with open(po_path, 'w', encoding='utf-8') as f:
f.write('msgid "%s"\n' % po_escape(d))
f.write('msgstr "%s"\n\n' % po_escape(e))
# write .mo
def write_mo(entries, out):
keys = sorted(entries.keys())
ids = b''; strs = b''; offsets = []