Filipe: "die partner codes sollen auch schon fuer die leute sichtbar sein die angemeldet sind." Umgestellt, und auf Nachfrage dauerhaft: Rabattcodes sind ab jetzt ein Konto-Vorteil, kein Abo-Vorteil. WARUM DAS MEHR IST ALS EINE BEQUEMLICHKEIT Der alte Riegel verlangte einen Abo-Status. Nachgesehen, statt vermutet: Die Bezahlung auf abonnieren.html steht auf "Coming soon", bis Dogis PayPal-Business-Zugang da ist (der Kommentar dort nennt es beim Namen). Registrieren geht, bezahlen nicht. Der erste echte Partnercode lag damit seit gestern hinter einer Tuer, die sich gar nicht oeffnen laesst -- er waere fuer NIEMANDEN sichtbar gewesen ausser fuer Dogi und VanVan ueber die Rollenvorschau. Entschieden wird jetzt an "supporterToken" (beim Login gesetzt, beim Logout entfernt, supporter.js). Der Abo-Stand wird als Sicherheitsnetz weiter mitgelesen: Niemand soll Zugang verlieren, den er gestern hatte. BEIDE STELLEN, NICHT EINE Die Bedingung steht doppelt im Haus -- an der Kachel auf links.html und an der Seite selbst. Nur eine davon umzustellen erzeugt einen Fehler, den keine der beiden fuer sich zeigt: Man kaeme mit Konto auf die Seite und saehe dort die Sperre. Beide sind umgestellt, tragen den Hinweis aufeinander, und die Pruefung vergleicht sie in jedem Anmeldezustand gegeneinander. TEXTE, DIE SONST GELOGEN HAETTEN "Nur fuer Supporter" auf einer Seite, die ein kostenloses Konto oeffnet, schickt Leute zum Bezahlen fuer etwas, das sie umsonst bekommen. Kopf, Vorspann, Kachelband, Beschreibung und Sperrtext sagen jetzt "Konto", in allen fuenf Sprachen. Die Sperre bietet auf Filipes Wunsch beide Wege an: den kostenlosen zuerst, das Abo daneben -- mit einer Zeile darunter, dass es erst startet, wenn es offiziell live geht. Ohne die waere der zweite Knopf eine Falle. EIN FEHLER, DER SEIT DEM 03.08.2026 DRINSTAND Die Pruefung meldete auf der FREIGESCHALTETEN Kachel weiter "Nur mit Konto" statt "Freigeschaltet". Ursache: Das Skript setzte den Text (`badge.textContent = ...`), aber applyTranslations() schreibt aus dem data-i18n-Attribut zurueck -- und es laeuft danach noch einmal, weil dogiSiteTexteLaden() die Texte aus der Verwaltung holt und dann neu uebersetzt. NACHGEMESSEN STATT HERGELEITET, und die erste Erklaerung war zu schnell: Der Text war schon nach 50 ms falsch, also nicht "irgendwann spaeter ueberschrieben". Der Grund ist, dass TEAM_API_BASIS auf den ECHTEN Worker zeigt -- der Abruf gelingt selbst aus einer lokalen Testseite. Kontroll- versuch mit blockiertem Abruf: derselbe alte Code, und das Band bleibt korrekt. Ursache weg, Fehler weg. Behoben, indem der SCHLUESSEL getauscht wird statt des Textes. Damit schreibt jeder weitere Uebersetzungslauf von selbst das Richtige hin -- auch bei Sprachwechsel, wo die alte Fassung ebenfalls zurueckfiel. Aufgefallen ist es nie, weil bis gestern niemand in den freigeschalteten Zustand kommen konnte. NEBENBEFUND, NICHT ANGEFASST: index.html hat dieselbe Bauart beim Live-Status (#live-text mit data-i18n, Text per Skript gesetzt). Gemessen ist es dort ein Wettlauf zweier Abrufe -- in meinem Lauf gewann der Status um Haaresbreite, und ein Sprachwechsel repariert es dort ohnehin (dogi-sprache-geaendert). Kleiner, aber echt. Auf Ansage. pruef-rabattcodes EXIT=0 (63 Pruefungen, vorher 42). Neu darunter: drei Anmeldezustaende statt zweier -- ausgeloggt, angemeldet ohne Abo, angemeldet mit Abo --, jeder auf BEIDEN Seiten, dazu der Klick auf die Kachel (fuehrt sie wirklich weiter?), die Beschriftung des Bands und als Gegenprobe ein erzwungener Uebersetzungslauf, der den alten Fehler zuverlaessig ausloest. Co-Authored-By: Claude Opus 5 <[email protected]>
166 lines
8.8 KiB
JavaScript
166 lines
8.8 KiB
JavaScript
/* =====================================================================
|
||
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 "&" hin.
|
||
data-i18n-attr="alt:schluessel" -> el.setAttribute(...)
|
||
Dort gehört ein blankes "&" hin;
|
||
"&" 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 mit Konto", "de-CH": "🔒 Nur mit Konto",
|
||
en: "🔒 Account required", fr: "🔒 Compte requis", pt: "🔒 Requer conta",
|
||
},
|
||
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 — für alle mit einem Konto im DOGFATHER UNIVERSE.",
|
||
"de-CH": "Codes vo Dogis Partner — für alli mit eme Konto im DOGFATHER UNIVERSE.",
|
||
en: "Codes from Dogi's partners — for everyone with a DOGFATHER UNIVERSE account.",
|
||
fr: "Des codes chez les partenaires de Dogi — pour toute personne ayant un compte DOGFATHER UNIVERSE.",
|
||
pt: "Códigos dos parceiros do Dogi — para todos com uma conta no DOGFATHER UNIVERSE.",
|
||
},
|
||
rc_gesperrt_titel: {
|
||
de: "Melde dich an, dann sind sie da",
|
||
"de-CH": "Meld di aa, denn sind si da",
|
||
en: "Sign in and they're right here",
|
||
fr: "Connecte-toi et ils sont là",
|
||
pt: "Inicia sessão e estão aqui",
|
||
},
|
||
/* Zweimal angepasst, beide Male weil der Satz nicht mehr stimmte:
|
||
08.09.2026 früh endete er auf "sobald die ersten Kooperationen live
|
||
sind" — die erste WAR ab da live. Am selben Tag hat Filipe die Sperre
|
||
vom Abo auf das Konto umgestellt; seither wäre "exklusiver Vorteil
|
||
der DogiCrew" schlicht falsch. Der Text nennt jetzt genau die eine
|
||
Bedingung, die wirklich gilt, und dass sie nichts kostet. */
|
||
rc_gesperrt_text: {
|
||
de: "Die Rabattcodes gibt es für alle mit einem Konto bei Dogfather — Registrieren ist kostenlos und dauert eine Minute. Der erste Partnercode wartet schon.",
|
||
"de-CH": "D Rabattcodes gits für alli mit eme Konto bi Dogfather — Registriere isch gratis und duuret e Minute. De erst Partnercode wartet scho.",
|
||
en: "Discount codes are there for everyone with a Dogfather account — signing up is free and takes a minute. The first partner code is already waiting.",
|
||
fr: "Les codes de réduction sont là pour toute personne ayant un compte Dogfather — l'inscription est gratuite et prend une minute. Le premier code partenaire attend déjà.",
|
||
pt: "Os códigos de desconto existem para todos com uma conta Dogfather — registares-te é gratuito e demora um minuto. O primeiro código de parceiro já está à espera.",
|
||
},
|
||
rc_btn_anmelden: {
|
||
de: "Anmelden oder kostenlos registrieren",
|
||
"de-CH": "Aamelde oder gratis registriere",
|
||
en: "Sign in or register for free",
|
||
fr: "Se connecter ou s'inscrire gratuitement",
|
||
pt: "Iniciar sessão ou registar gratuitamente",
|
||
},
|
||
rc_btn_abo: {
|
||
de: "Supporter werden 👑", "de-CH": "Supporter werde 👑",
|
||
en: "Become a supporter 👑", fr: "Devenir Supporter 👑", pt: "Tornar-se apoiador 👑",
|
||
},
|
||
/* Ohne diese Zeile wäre der zweite Knopf eine Falle: Das bezahlte Abo
|
||
ist noch nicht freigeschaltet (abonnieren.html zeigt dort "Coming
|
||
soon…", bis Dogis PayPal-Business-Zugang steht). Wer ihn drückt,
|
||
soll vorher wissen, was ihn erwartet — und dass er für die Codes
|
||
nicht nötig ist. */
|
||
rc_abo_hinweis: {
|
||
de: "Fürs Abo brauchst du ebenfalls erst ein Konto — es startet, sobald es offiziell live geht.",
|
||
"de-CH": "Fürs Abo bruuchsch au zerscht es Konto — es startet, sobald es offiziell live gaht.",
|
||
en: "The subscription needs an account too — it starts as soon as it officially goes live.",
|
||
fr: "L'abonnement nécessite lui aussi un compte — il démarre dès son lancement officiel.",
|
||
pt: "A subscrição também precisa de uma conta — arranca assim que ficar oficialmente disponível.",
|
||
},
|
||
|
||
/* ---- 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",
|
||
},
|
||
};
|