Files
dogfather-universe/assets/js/i18n-rabattcodes.js
T
DogFatherGitandClaude Opus 5 8cdc31bd46 Der erste Partnercode steht: DOGI10 auf einer gepraegten Muenze
Die Rabattcodeseite war ein Platzhalter -- "Codes folgen in Kuerze" und
darunter eine Vorschaukachel mit dem erfundenen Code "DOGFATHER". Jetzt
steht der erste echte drauf: DOGI10 fuer Van's DIY & Bastelbedarf,
verlinkt auf vans-diy-bastelbedarf.com.

DIE KONDITIONEN SIND ABGELESEN, NICHT GERATEN.

Aus "DOGI10" auf zehn Prozent zu schliessen, waere naheliegend gewesen,
haette zufaellig gestimmt und waere trotzdem falsch gewesen. Nachgesehen
im Shop selbst (src/content/partnercodes.json):

  { "code": "DOGI10", "prozent": 10, "bis": "2026-09-30",
    "aktiv": true, "giltAufSale": false }

Zwei der drei Angaben stehen im Namen NICHT drin: dass der Code am
30.09.2026 auslaeuft und dass er auf bereits reduzierte Artikel nicht
gilt. Beides steht jetzt sichtbar auf der Karte. Eine falsche Zusage auf
einer Verkaufsseite kostet VanVan die Diskussion an der Kasse.

Gegengeprueft, dass die Datei auch wirklich gilt und kein Ueberbleibsel
ist: Sie wird an zwei Stellen ausgewertet, src/scripts/cart.ts fuer den
Warenkorb und server/lib/preis-berechnen.js fuer den Endpreis, beide mit
derselben Regel (aktiv !== false UND jetzt <= bis 23:59:59).

DAS ABLAUFDATUM IST EINE ZEITBOMBE, ALSO BEKOMMT ES EINEN ZUENDER.

Ein fest eingetippter Satz "gueltig bis 30.09.2026" stimmt, bis der
Kalender ihn ueberholt -- ab dem 01.10. verspraeche die Seite etwas, das
der Shop schon ablehnt. Genau dieselbe Falle hat am 06.09. den
Oeffnungstest im Shop umgeworfen. Das Datum steht deshalb nicht nur im
Text, sondern einmal als Zahl im Skript: Ist es vorbei, schaltet die
Karte selbsttaetig auf "abgelaufen", streicht den Code durch und sperrt
den Kopierknopf, statt weiter zu werben.

DAS LOGO: AUS EINEM SIEGEL WIRD EINE MUENZE.

Filipe hat das Logo als Bildschirmfoto aus TikTok geliefert, rundes
Siegel auf schwarzem Grund. Ungestellt waere daraus auf der dunklen
Karte ein sichtbarer schwarzer Kasten geworden -- derselbe Fehler wie
bei der Workspace-Marke, deren Zahlen damals tadellos aussahen.

Freigestellt wird per Flutfuellung vom Bildrand (tools/partner-siegel-
freistellen.mjs, 384 px WebP, 37 KB). Eine Kreismaske waere hier sogar
ausrechenbar gewesen -- Mitte 539,5/526,5, Radius 495 -- und haette
genau fuer dieses eine Bild funktioniert. Die Fuellung MISST die Form,
statt sie vorauszusetzen: Der naechste Partner ist ein Eintrag in
AUFTRAEGE und sonst nichts. Die Quelle liegt mit im Repo, sonst laesst
sich das Werkzeug genau einmal ausfuehren und ist danach Dekoration.

"Extrem speziell" fuehrt hier NICHT ueber mehr Farbe -- das Siegel ist
schwarz-weiss, jede Einfaerbung lackierte eine fremde Marke um. Es
fuehrt ueber mehr Material: sechs CSS-Lagen, kein zweites Bild.

  Aura     weicher Lichthof, atmet in 9 s
  Raendel  die geriffelte Muenzkante, 72 Zaehne. Sie steht STILL --
           eine sich drehende Riffelung flimmert bei 148 px, und das
           waere genau die grelle Optik, die die Hausregel ausschliesst
  Glanz    stattdessen wandert EIN Lichtpunkt in 22 s um die Kante.
           Das ist die Bewegung, die eine Muenze im Licht macht
  Schliff  Praegekante nach innen, oben Licht, unten Schatten
  Ablage   elliptischer Schatten, damit die Muenze auf der Karte LIEGT

Bei prefers-reduced-motion steht alles davon still.

NEBENBEFUND, DER SONST NIEMANDEM AUFGEFALLEN WAERE: Der Text auf der
Sperrkachel endete auf "sobald die ersten Kooperationen live sind".
Seit heute IST die erste live -- der Satz haette jemanden dafuer zahlen
lassen, auf etwas zu warten, das schon hinter der Sperre liegt.
Ebenfalls nachgemessen statt vermutet: die Warengruppen im
Beschreibungssatz sind die echten Kategorien des Shops.

pruef-rabattcodes EXIT=0 (42 Pruefungen), darunter beide Richtungen der
Supporter-Sperre, die Bildpunkte des ausgelieferten Siegels (Ecken
durchsichtig, Mitte deckend, 69 % Flaeche), das Kopieren gegen die echte
Zwischenablage samt Gegenprobe davor, die Ablaufschaltung mit gestellter
Uhr an beiden Seiten des Stichtags und alle fuenf Sprachen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-08 18:48:11 +02:00

142 lines
7.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* =====================================================================
i18n-rabattcodes.js — Übersetzungs-Wörterbuch NUR für rabattcodes.html
Alle 5 Sprachen vollständig gepflegt (de, de-CH, en, fr, pt).
⚠️ ZWEI EINSETZWEGE, ZWEI SCHREIBWEISEN FÜR "&" (siehe main.js,
applyTranslations):
data-i18n="schluessel" -> el.innerHTML = text
Dort gehört "&amp;" hin.
data-i18n-attr="alt:schluessel" -> el.setAttribute(...)
Dort gehört ein blankes "&" hin;
"&amp;" stünde wörtlich im
Vorlesetext.
Betroffen ist hier genau ein Eintrag: rc_logo_alt (Attribut, blankes
"&"). Der Markenname selbst steht bewusst NICHT im Wörterbuch — "Van's
DIY & Bastelbedarf" heißt in jeder Sprache gleich.
===================================================================== */
window.I18N_PAGE = {
rc_eyebrow: {
de: "🔒 Nur für Supporter", "de-CH": "🔒 Nur für Supporter",
en: "🔒 Supporters only", fr: "🔒 Réservé aux Supporters", pt: "🔒 Somente para apoiadores",
},
rc_h1: {
de: "Rabattcodes", "de-CH": "Rabattcodes",
en: "Discount Codes", fr: "Codes de réduction", pt: "Códigos de desconto",
},
rc_lead: {
de: "Codes von Dogis Partnern — exklusiv für Dogfather-Supporter.",
"de-CH": "Codes vo Dogis Partner — exklusiv für Dogfather-Supporter.",
en: "Codes from Dogi's partners — exclusive to Dogfather supporters.",
fr: "Des codes chez les partenaires de Dogi — exclusifs aux Supporters Dogfather.",
pt: "Códigos dos parceiros do Dogi — exclusivos para apoiadores do Dogfather.",
},
rc_gesperrt_titel: {
de: "Nur für Dogfather-Supporter", "de-CH": "Nur für Dogfather-Supporter",
en: "Dogfather supporters only", fr: "Réservé aux Supporters Dogfather", pt: "Somente para apoiadores do Dogfather",
},
/* Stand 08.09.2026 angepasst: Der Satz endete vorher auf "sobald die
ersten Kooperationen live sind". Seit heute IST die erste live —
der alte Text hätte einen Supporter dafür bezahlen lassen, auf etwas
zu warten, das schon hinter der Sperre liegt. */
rc_gesperrt_text: {
de: "Rabattcodes sind ein exklusiver Vorteil der DogiCrew 🩵. Der erste Partnercode ist schon drin — werde jetzt Teil davon, um ihn freizuschalten.",
"de-CH": "Rabattcodes sind e exklusive Vorteil vo dr DogiCrew 🩵. De erst Partnercode isch scho dinn — wird jetzt Teil devo, zum en freizschalte.",
en: "Discount codes are an exclusive perk of the DogiCrew 🩵. The first partner code is already in there — join now to unlock it.",
fr: "Les codes de réduction sont un avantage exclusif de la DogiCrew 🩵. Le premier code partenaire est déjà là — rejoins-la maintenant pour le débloquer.",
pt: "Os códigos de desconto são um benefício exclusivo da DogiCrew 🩵. O primeiro código de parceiro já lá está — junta-te agora para o desbloquear.",
},
rc_btn_abo: {
de: "Jetzt Supporter werden 👑", "de-CH": "Jetzt Supporter werde 👑",
en: "Become a supporter now 👑", fr: "Devenir Supporter maintenant 👑", pt: "Tornar-se apoiador agora 👑",
},
/* ---- Erster Partner: Van's DIY & Bastelbedarf (DOGI10) ---------- */
rc_band: {
de: "Partner Nr. 1", "de-CH": "Partner Nr. 1",
en: "Partner no. 1", fr: "Partenaire n° 1", pt: "Parceiro n.º 1",
},
/* Attribut-Eintrag: blankes "&", siehe Kopf dieser Datei. */
rc_logo_alt: {
de: "Logo von Van's DIY & Bastelbedarf",
"de-CH": "Logo vo Van's DIY & Bastelbedarf",
en: "Logo of Van's DIY & Bastelbedarf",
fr: "Logo de Van's DIY & Bastelbedarf",
pt: "Logótipo de Van's DIY & Bastelbedarf",
},
/* Die aufgezählten Warengruppen sind die echten Kategorien des Shops
(src/content/categories/), nicht das, was man bei "Bastelbedarf"
vermuten würde: Bastelzubehör, Häkelzubehör, DIY Häkelwerke, DIY
Plushies, DIY Modeschmuck & Accessoires, Mystery-Pakete. */
rc_beschreibung: {
de: "Häkelzubehör, Bastelbedarf, DIY-Plushies und Modeschmuck — VanVans eigener Shop.",
"de-CH": "Häkelzubehör, Bastelbedarf, DIY-Plushies und Modeschmuck — VanVans eigene Shop.",
en: "Crochet supplies, craft materials, DIY plushies and handmade jewellery — VanVan's own shop.",
fr: "Accessoires de crochet, matériel de bricolage, peluches DIY et bijoux — la boutique de VanVan.",
pt: "Acessórios de crochet, material de artesanato, plushies DIY e bijutaria — a loja da VanVan.",
},
rc_code_kopf: {
de: "Dein Code", "de-CH": "Din Code",
en: "Your code", fr: "Ton code", pt: "O teu código",
},
rc_code_fuss: {
de: "Tippen zum Kopieren", "de-CH": "Tippe zum Kopiere",
en: "Tap to copy", fr: "Touche pour copier", pt: "Toca para copiar",
},
rc_code_kopiert: {
de: "Code kopiert ✓", "de-CH": "Code kopiert ✓",
en: "Code copied ✓", fr: "Code copié ✓", pt: "Código copiado ✓",
},
rc_code_fehler: {
de: "Kopieren ging nicht — bitte von Hand abtippen.",
"de-CH": "Kopiere het nöd klappt — bitte vo Hand abtippe.",
en: "Copying didn't work — please type it in by hand.",
fr: "La copie n'a pas fonctionné — saisis-le à la main.",
pt: "A cópia não funcionou — escreve-o à mão.",
},
/* Die drei Konditionen stehen 1:1 so im Shop (partnercodes.json,
Eintrag DOGI10) — nicht aus dem Codenamen geschlossen. */
rc_fakt_rabatt: {
de: "<b>10 %</b> Rabatt auf deinen Einkauf",
"de-CH": "<b>10 %</b> Rabatt uf din Iikauf",
en: "<b>10%</b> off your order",
fr: "<b>10 %</b> de remise sur ta commande",
pt: "<b>10 %</b> de desconto na tua compra",
},
rc_fakt_bis: {
de: "Gültig bis 30.09.2026", "de-CH": "Gültig bis 30.09.2026",
en: "Valid until 30 September 2026", fr: "Valable jusqu'au 30.09.2026", pt: "Válido até 30.09.2026",
},
rc_fakt_sale: {
de: "Nicht auf bereits reduzierte Artikel",
"de-CH": "Nöd uf scho reduzierti Artikel",
en: "Not valid on items that are already reduced",
fr: "Non valable sur les articles déjà réduits",
pt: "Não válido em artigos já reduzidos",
},
rc_abgelaufen: {
de: "Dieser Code ist ausgelaufen. Dogi klärt gerade die Verlängerung — schau bald wieder rein.",
"de-CH": "De Code isch abglaufe. Dogi klärt grad d Verlängerig — lueg bald wieder verbi.",
en: "This code has expired. Dogi is sorting out an extension — check back soon.",
fr: "Ce code a expiré. Dogi s'occupe d'une prolongation — repasse bientôt.",
pt: "Este código expirou. O Dogi está a tratar da renovação — volta em breve.",
},
rc_btn_shop: {
de: "Zum Shop von Van’s DIY ↗", "de-CH": "Zum Shop vo Van’s DIY ↗",
en: "Go to the Van’s DIY shop ↗", fr: "Voir la boutique Van’s DIY ↗", pt: "Ir à loja Van’s DIY ↗",
},
rc_mehr: {
de: "Weitere Codes folgen, sobald die nächsten Kooperationen stehen.",
"de-CH": "Wyteri Codes chömed, sobald die nächste Kooperatione stönd.",
en: "More codes will follow as soon as the next collaborations are in place.",
fr: "D'autres codes suivront dès que les prochaines collaborations seront conclues.",
pt: "Mais códigos seguem assim que as próximas parcerias estiverem fechadas.",
},
rc_btn_zurueck: {
de: "← Zurück zu allen Links", "de-CH": "← Zrugg zu alle Links",
en: "← Back to all links", fr: "← Retour à tous les liens", pt: "← Voltar a todos os links",
},
};