Files
dogfather-universe/assets/js/i18n-supporter.js
T
DogFatherGitandClaude Opus 5 bda3198c76 Neue Funktion: Supporter-Abstimmungen (Verwaltung + DogiCrew-Bereich)
Naechste "Ausbaustufe" aus Dogfather_VanVan_Supporter_Abo.odt Abschnitt 20
(siehe Supporter-Abo-System.md), auf Nutzerwunsch "perfektioniere meine
Verwaltungsseite": Dogi/VanVan koennen in verwaltung.html eine Frage mit
2-6 Antwortoptionen auf Deutsch erstellen, automatische Uebersetzung beim
Speichern (gleiches Muster wie "Event des Jahres"). Jede aktive DogiCrew-
Person sieht die Abstimmung in ihrem Supporter-Bereich, stimmt genau einmal
ab (UNIQUE-Constraint in der DB, nicht nur Anwendungslogik), sieht danach
die Live-Ergebnisse. Admin-Seite zeigt Ergebnisbalken live, kann schliessen/
wiedereroeffnen/loeschen.

- Neue Migration 0005_supporter_polls.sql (supporter_polls,
  supporter_poll_votes), neue Berechtigung POLLS_MANAGE.
- server-internal/routes/polls.js: 30 End-to-End-Tests gegen eine
  Fake-DB bestanden (better-sqlite3 laesst sich lokal nicht kompilieren).
- verwaltung.html: neue "Abstimmungen"-Kiste im bestehenden
  vw-overview-box-Stil (violett/pink Ergebnisbalken).
- supporter.html: neue "Aktuelle Abstimmung"-Karte im bestehenden
  Gold-Look, Optionen -> Stimme -> Ergebnisbalken, alle 5 Sprachen.

Backend-Teil (server-internal/, cloudflare-worker/migrations/) noch ohne
Deploy-Zugriff -- Dogi muss ihn manuell auf dogiintern ausrollen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-08-20 16:07:51 +02:00

132 lines
5.7 KiB
JavaScript

/* =====================================================================
i18n-supporter.js — Übersetzungs-Wörterbuch NUR für supporter.html
Alle 5 Sprachen vollständig gepflegt (de, de-CH, en, fr, pt).
Hinweis: Die dynamisch aus der API befüllten Inhalte (Status-Labels,
Prämien-Namen, Archiv-Texte) werden aktuell noch fest auf Deutsch
generiert (siehe <script> unten im HTML) — vollständige Mehrsprachigkeit
für diese dynamischen Texte ist als Ausbaustufe vorgemerkt, hier zunächst
nur der statische Seitenrahmen (Überschriften/Buttons).
===================================================================== */
window.I18N_PAGE = {
su_eyebrow: {
de: "👑 Supporter-Bereich", "de-CH": "👑 Supporter-Bereich",
en: "👑 Supporter Area", fr: "👑 Espace Supporter", pt: "👑 Área do Apoiador",
},
su_lade: {
de: "Dein Supporter-Bereich", "de-CH": "Dis Supporter-Bereich",
en: "Your Supporter Area", fr: "Ton espace Supporter", pt: "Sua Área de Apoiador",
},
su_lead: {
de: "Danke, dass du Dogfather dauerhaft unterstützt.", "de-CH": "Danke, dass du Dogfather duurhaft unterstützisch.",
en: "Thank you for supporting Dogfather long-term.", fr: "Merci de soutenir Dogfather durablement.", pt: "Obrigado por apoiar Dogfather a longo prazo.",
},
su_fenster1_h2: {
de: "Mein Abo", "de-CH": "Mis Abo",
en: "My Subscription", fr: "Mon abonnement", pt: "Minha assinatura",
},
su_stat_status: {
de: "Status", "de-CH": "Status",
en: "Status", fr: "Statut", pt: "Status",
},
su_stat_preis: {
de: "Monatlicher Preis", "de-CH": "Monetliche Priis",
en: "Monthly price", fr: "Prix mensuel", pt: "Preço mensal",
},
su_stat_naechste_zahlung: {
de: "Nächste Zahlung", "de-CH": "Nächsti Zahlig",
en: "Next payment", fr: "Prochain paiement", pt: "Próximo pagamento",
},
su_stat_monate: {
de: "Bezahlte Monate gesamt", "de-CH": "Bezahlti Monet insgsamt",
en: "Total paid months", fr: "Total des mois payés", pt: "Total de meses pagos",
},
su_stat_zyklus: {
de: "Aktueller Zyklus", "de-CH": "Aktuelle Zyklus",
en: "Current cycle", fr: "Cycle actuel", pt: "Ciclo atual",
},
su_stat_details_hinweis: {
de: "Details ansehen", "de-CH": "Details aaluege",
en: "View details", fr: "Voir les détails", pt: "Ver detalhes",
},
su_kein_abo_text: {
de: "Du hast noch kein aktives Abo.", "de-CH": "Du häsch no kein aktivs Abo.",
en: "You don't have an active subscription yet.", fr: "Tu n'as pas encore d'abonnement actif.", pt: "Você ainda não tem uma assinatura ativa.",
},
su_kein_abo_btn: {
de: "Jetzt abonnieren", "de-CH": "Jetzt abonniere",
en: "Subscribe now", fr: "S'abonner maintenant", pt: "Assine agora",
},
su_fenster2_h2: {
de: "Mein aktueller Fortschritt", "de-CH": "Mis aktuelle Fortschritt",
en: "My Current Progress", fr: "Ma progression actuelle", pt: "Meu progresso atual",
},
su_archiv_h2: {
de: "Mein Sammlungsarchiv", "de-CH": "Mis Sammligsarchiv",
en: "My Collection Archive", fr: "Mes archives de collection", pt: "Meu arquivo de coleção",
},
su_verwalten_h2: {
de: "Abo verwalten", "de-CH": "Abo verwalte",
en: "Manage Subscription", fr: "Gérer l'abonnement", pt: "Gerenciar assinatura",
},
su_feld_name: {
de: "Name / Anzeigename", "de-CH": "Name / Aazeigename",
en: "Name / display name", fr: "Nom / pseudo", pt: "Nome / nome de exibição",
},
su_feld_tiktok: {
de: "TikTok-Benutzername", "de-CH": "TikTok-Benutzername",
en: "TikTok username", fr: "Nom d'utilisateur TikTok", pt: "Nome de usuário do TikTok",
},
su_btn_profil_speichern: {
de: "Speichern", "de-CH": "Spichere",
en: "Save", fr: "Enregistrer", pt: "Salvar",
},
su_profil_gespeichert: {
de: "Gespeichert.", "de-CH": "Gspicheret.",
en: "Saved.", fr: "Enregistré.", pt: "Salvo.",
},
su_btn_kuendigen: {
de: "Abo kündigen", "de-CH": "Abo kündige",
en: "Cancel subscription", fr: "Résilier l'abonnement", pt: "Cancelar assinatura",
},
su_btn_logout: {
de: "Ausloggen", "de-CH": "Uslogge",
en: "Log out", fr: "Se déconnecter", pt: "Sair",
},
su_nicht_eingeloggt: {
de: "Du bist nicht eingeloggt.", "de-CH": "Du bisch nid yyglogget.",
en: "You're not logged in.", fr: "Tu n'es pas connecté(e).", pt: "Você não está conectado.",
},
su_zum_abo: {
de: "Zur DogiCrew 🩵", "de-CH": "Zur DogiCrew 🩵",
en: "Go to the DogiCrew 🩵", fr: "Aller à la DogiCrew 🩵", pt: "Ir para a DogiCrew 🩵",
},
/* Supporter-Abstimmungen (20.08.2026) */
su_poll_eyebrow: {
de: "🗳️ Aktuelle Abstimmung", "de-CH": "🗳️ Aktueui Abstimmig",
en: "🗳️ Current Poll", fr: "🗳️ Sondage en cours", pt: "🗳️ Enquete atual",
},
su_poll_btn_abstimmen: {
de: "Abstimmen", "de-CH": "Abstimme",
en: "Vote", fr: "Voter", pt: "Votar",
},
su_poll_bitte_waehlen: {
de: "Bitte wähle eine Antwort aus.", "de-CH": "Bitte wähl e Antwort us.",
en: "Please choose an answer.", fr: "Merci de choisir une réponse.", pt: "Por favor, escolha uma resposta.",
},
su_poll_danke: {
de: "Danke, deine Stimme wurde gezählt! 💙", "de-CH": "Danke, dini Stimm isch zellt worde! 💙",
en: "Thanks, your vote was counted! 💙", fr: "Merci, ton vote a été pris en compte ! 💙", pt: "Obrigado, seu voto foi contado! 💙",
},
su_poll_stimmen: {
de: "Stimmen", "de-CH": "Stimme",
en: "votes", fr: "votes", pt: "votos",
},
su_poll_fehler: {
de: "Abstimmen hat leider nicht geklappt. Bitte versuch es nochmal.", "de-CH": "Abstimme het leider nid klappt. Bitte versuech's nomol.",
en: "Voting didn't work. Please try again.", fr: "Le vote a échoué. Merci de réessayer.", pt: "A votação falhou. Por favor, tente novamente.",
},
};