Files
dogfather-universe/assets/js/i18n-wd-portfolio.js
T
DogFatherGitandClaude Opus 5 4b3ec450d5 Webdesign-Bereich: Fundament, oeffentliche Seiten, Zugangsschutz, PayPal
Umsetzung des "Website Masterplan" (16 Seiten) unter /webdesign.

Zugangsschutz mit EIGENER Schranke (server/webdesign-gate.js) statt gate.js:
gate.js laesst seit dem oeffentlichen Start am 21.08.2026 jeden durch, weil
die Pruefung auf SITE_PUBLIC_LAUNCH_AT als allererste Zeile steht. Haette man
/webdesign dahintergehaengt, waere der ausdruecklich nicht-oeffentliche Bereich
inklusive Preisen und spaeteren Kundendaten ab der ersten Sekunde fuer jeden
lesbar gewesen. Eigenes Sitzungs-Cookie, bereich="webdesign" im Token, damit
ein gueltiges Universe-Cookie hier NICHT gilt. 37/37 Tests.

Sieben oeffentliche Seiten in fuenf Sprachen (de, de-CH mit echtem Dialekt, en,
fr, pt). Preise, Zeitrahmen, Paketnamen und die 30-%-Regel stehen an genau
EINER Stelle in wd-core.js -- der Masterplan verlangt "ueberall
widerspruchsfrei", und vier Kopien laufen bei der ersten Preisaenderung
auseinander.

Als App installierbar auf Handy und PC. Der Service Worker speichert bewusst
KEINE HTML-Seite zwischen: nach dem Abmelden wuerden sonst geschuetzte Seiten
weiter ausgeliefert, ohne dass der Server je gefragt wird. 18/18 Tests.

Handy-Abnahme ueber alle Seiten in fuenf Breiten (320-1440) und fuenf Sprachen:
40/40. Der Test fand 35 echte Fehler (Touch-Ziele unter 44px), behoben im
Designsystem statt einzeln pro Seite.

PayPal (Wunsch 22.08.2026 "sofort auf meinem paypal"): Orders API mit
intent=CAPTURE, also sofortiger Einzug statt blosser Reservierung. Gebuehr und
Nettobetrag getrennt gespeichert. Betraege durchgehend als Ganzzahl in Cent.
Gefaelschte Webhooks werden abgewiesen. Fail closed solange Zugangsdaten
fehlen. 28/28 Tests gegen einen nachgebauten PayPal-Server.

Datenbank: 15 Tabellen mit Praefix wd_, fachlich vollstaendig vom Universe
getrennt.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-08-22 18:06:52 +02:00

165 lines
19 KiB
JavaScript

/* =====================================================================
i18n-wd-portfolio.js — Portfolio (Masterplan S.11)
Inhaltsregeln, die hier bewusst eingehalten sind:
- Keine erfundenen Kundenbewertungen. Auf dieser Seite steht KEIN
einziges Zitat, weil es noch keines gibt, das jemand freigegeben hat.
- Keine fremden Projekte ohne Erlaubnis. Beide gezeigten Seiten sind
eigene Projekte; die Vorschaubilder sind echte Screenshots der
laufenden Seiten vom 22.08.2026, keine Mockups.
- Jede Referenz im gleichen Format: Ausgangslage, Lösung, Ergebnis.
===================================================================== */
window.I18N_WD = {
seiten_titel: {
de: "Portfolio — Dogfather Webdesign",
"de-CH": "Portfolio — Dogfather Webdesign",
en: "Portfolio — Dogfather Web Design",
fr: "Portfolio — Dogfather Web Design",
pt: "Portfólio — Dogfather Web Design",
},
pf_eyebrow: { de: "Portfolio", "de-CH": "Portfolio", en: "Portfolio", fr: "Portfolio", pt: "Portfólio" },
pf_h1: {
de: "Zwei Projekte, die man anfassen kann",
"de-CH": "Zwei Projekt, wo mer aalange cha",
en: "Two projects you can actually visit",
fr: "Deux projets que l'on peut réellement visiter",
pt: "Dois projetos que se podem mesmo visitar",
},
pf_lead: {
de: "Beide Seiten laufen wirklich, unter ihrer eigenen Adresse, auf einem eigenen Server. Die Vorschaubilder sind echte Aufnahmen der laufenden Seiten — keine gezeichneten Entwürfe.",
"de-CH": "Beidi Site laufed würklich, under ihrer eigene Adress, uf eme eigene Server. D Vorschaubilder sind ächti Ufnahme vo de laufende Site — kei zeichneti Entwürf.",
en: "Both sites are genuinely running, at their own address, on their own server. The preview images are real captures of the live sites — not drawn mockups.",
fr: "Les deux sites fonctionnent réellement, à leur propre adresse, sur un serveur dédié. Les aperçus sont de vraies captures des sites en ligne — pas des maquettes dessinées.",
pt: "Ambos os sites estão mesmo no ar, no seu próprio endereço, em servidor próprio. As pré-visualizações são capturas reais dos sites ativos — não são maquetes desenhadas.",
},
/* Gemeinsame Beschriftungen — gleiches Format für jede Referenz */
pf_ausgang: { de: "Ausgangslage", "de-CH": "Uusgangslag", en: "Starting point", fr: "Situation de départ", pt: "Ponto de partida" },
pf_loesung: { de: "Umgesetzte Lösung", "de-CH": "Umgsetzti Lösig", en: "Solution built", fr: "Solution réalisée", pt: "Solução implementada" },
pf_ergebnis: { de: "Ergebnis", "de-CH": "Ergebnis", en: "Result", fr: "Résultat", pt: "Resultado" },
pf_funktionen: { de: "Wichtigste Funktionen", "de-CH": "Wichtigschti Funktione", en: "Key features", fr: "Fonctions clés", pt: "Funcionalidades principais" },
pf_stil: { de: "Stilrichtung", "de-CH": "Stilrichtig", en: "Visual style", fr: "Style visuel", pt: "Estilo visual" },
pf_details: { de: "Details ansehen", "de-CH": "Details aaluege", en: "See details", fr: "Voir les détails", pt: "Ver detalhes" },
pf_ansehen: { de: "Live ansehen", "de-CH": "Live aaluege", en: "View live", fr: "Voir en ligne", pt: "Ver ao vivo" },
/* --- Projekt 1: Dogfather Universe --- */
p1_h2: { de: "Dogfather Universe", "de-CH": "Dogfather Universe", en: "Dogfather Universe", fr: "Dogfather Universe", pt: "Dogfather Universe" },
p1_alt: {
de: "Startseite von dogfather-universe.com",
"de-CH": "Startsite vo dogfather-universe.com",
en: "Home page of dogfather-universe.com",
fr: "Page d'accueil de dogfather-universe.com",
pt: "Página inicial de dogfather-universe.com",
},
p1_art: { de: "Umfangreiche Website", "de-CH": "Grossi Website", en: "Large website", fr: "Grand site", pt: "Site extenso" },
p1_ausgang: {
de: "Drei getrennte Welten — Streaming, eine Community rund um HasiDog und der Manager-Bereich — sollten unter ein Dach, ohne dass Besucher sich verlaufen. Vorher lagen die Inhalte über mehrere Plattformen verstreut und niemand hatte den Überblick.",
"de-CH": "Drü trennti Wälte — Streaming, e Community rund um HasiDog und dr Manager-Bereich — hend under es Dach sölle, ohni dass Bsuecher sich verlaufed. Vorher sind d Inhalt über mehreri Plattforme verstreut gläge und niemert het dr Überblick gha.",
en: "Three separate worlds — streaming, a community around HasiDog, and the manager area — had to live under one roof without visitors getting lost. Previously the content was scattered across several platforms and nobody had an overview.",
fr: "Trois univers distincts — le streaming, une communauté autour de HasiDog et l'espace manager — devaient cohabiter sans que les visiteurs se perdent. Auparavant, les contenus étaient éparpillés sur plusieurs plateformes et personne n'avait de vue d'ensemble.",
pt: "Três mundos separados — streaming, uma comunidade em torno do HasiDog e a área de manager — tinham de caber sob o mesmo teto sem que os visitantes se perdessem. Antes, os conteúdos estavam espalhados por várias plataformas e ninguém tinha visão de conjunto.",
},
p1_loesung: {
de: "Eine Seite mit drei farblich klar getrennten Welten, gemeinsamer Navigation und durchgängig fünf Sprachen. Dazu ein Verwaltungsbereich, in dem Teammitglieder, Termine, Texte und Bewerbungen ohne Programmierkenntnisse gepflegt werden — und ein Supporter-Abo mit angebundener Zahlung.",
"de-CH": "Ei Site mit drü farblich klar trennte Wälte, gmeinsamer Navigation und durchgängig füf Sprooche. Dezue en Verwaltigsbereich, wo Teammitglieder, Termin, Täxt und Bewerbige ohni Programmierkenntnis pflegt wärded — und es Supporter-Abo mit aabundener Zahlig.",
en: "One site with three clearly colour-separated worlds, shared navigation and five languages throughout. Plus an admin area where team members, dates, texts and applications are maintained without programming knowledge — and a supporter subscription with integrated payment.",
fr: "Un site avec trois univers nettement distingués par la couleur, une navigation commune et cinq langues partout. S'y ajoutent un espace d'administration où membres de l'équipe, dates, textes et candidatures se gèrent sans compétences en programmation — et un abonnement supporter avec paiement intégré.",
pt: "Um site com três mundos claramente separados por cor, navegação partilhada e cinco idiomas em toda a parte. Além disso, uma área de administração onde membros da equipa, datas, textos e candidaturas são geridos sem conhecimentos de programação — e uma subscrição de apoiante com pagamento integrado.",
},
p1_ergebnis: {
de: "Seit August 2026 öffentlich und im täglichen Einsatz. Inhalte werden vom Team selbst gepflegt, ohne dass jemand Code anfassen muss. Die Seite läuft auf einem eigenen Server statt bei einem Anbieter, der jederzeit die Bedingungen ändern kann.",
"de-CH": "Sit Auguscht 2026 öffentlich und im tägliche Iisatz. Inhalt wärded vom Team sälber pflegt, ohni dass öpper Code aalange muess. D Site lauft uf eme eigene Server statt bi eme Aabieter, wo jederziit d Bedingige ändere cha.",
en: "Public since August 2026 and in daily use. Content is maintained by the team itself without anyone having to touch code. The site runs on its own server rather than with a provider that can change the terms at any time.",
fr: "En ligne depuis août 2026 et utilisé quotidiennement. Les contenus sont gérés par l'équipe elle-même sans que personne ait à toucher au code. Le site tourne sur un serveur dédié plutôt que chez un prestataire pouvant modifier ses conditions à tout moment.",
pt: "Público desde agosto de 2026 e em uso diário. Os conteúdos são geridos pela própria equipa sem ninguém ter de tocar em código. O site corre em servidor próprio em vez de num fornecedor que pode alterar as condições a qualquer momento.",
},
p1_f1: { de: "Fünf Sprachen, inklusive echtem Schweizerdeutsch", "de-CH": "Füf Sprooche, inklusiv ächtem Schwiizerdütsch", en: "Five languages, including genuine Swiss German", fr: "Cinq langues, dont un véritable suisse allemand", pt: "Cinco idiomas, incluindo suíço-alemão autêntico" },
p1_f2: { de: "Verwaltungsbereich mit Rollen und Rechten", "de-CH": "Verwaltigsbereich mit Rolle und Rächt", en: "Admin area with roles and permissions", fr: "Espace d'administration avec rôles et droits", pt: "Área de administração com perfis e permissões" },
p1_f3: { de: "Bewerbungssystem mit Statusverfolgung", "de-CH": "Bewerbigssyschtem mit Statusverfolgig", en: "Application system with status tracking", fr: "Système de candidature avec suivi de statut", pt: "Sistema de candidaturas com acompanhamento de estado" },
p1_f4: { de: "Supporter-Abo mit Zahlungsanbindung", "de-CH": "Supporter-Abo mit Zahligsaabindig", en: "Supporter subscription with payment integration", fr: "Abonnement supporter avec paiement intégré", pt: "Subscrição de apoiante com pagamento integrado" },
p1_f5: { de: "Automatische Live-Erkennung des Streams", "de-CH": "Automatischi Live-Erkennig vom Stream", en: "Automatic live detection of the stream", fr: "Détection automatique du direct", pt: "Deteção automática de transmissão em direto" },
p1_f6: { de: "Als App installierbar", "de-CH": "Als App installierbar", en: "Installable as an app", fr: "Installable comme application", pt: "Instalável como aplicação" },
p1_stil: {
de: "Dunkel und cinematisch, mit einer eigenen Leitfarbe je Welt.",
"de-CH": "Dunkel und cinematisch, mit ere eigene Leitfarb pro Wält.",
en: "Dark and cinematic, with its own signature colour per world.",
fr: "Sombre et cinématographique, avec une couleur dominante par univers.",
pt: "Escuro e cinematográfico, com uma cor própria para cada mundo.",
},
/* --- Projekt 2: Van's DIY --- */
p2_h2: { de: "Van's DIY &amp; Bastelbedarf", "de-CH": "Van's DIY &amp; Bastelbedarf", en: "Van's DIY &amp; Bastelbedarf", fr: "Van's DIY &amp; Bastelbedarf", pt: "Van's DIY &amp; Bastelbedarf" },
p2_alt: {
de: "Startseite von vans-diy-bastelbedarf.com",
"de-CH": "Startsite vo vans-diy-bastelbedarf.com",
en: "Home page of vans-diy-bastelbedarf.com",
fr: "Page d'accueil de vans-diy-bastelbedarf.com",
pt: "Página inicial de vans-diy-bastelbedarf.com",
},
p2_art: { de: "Onlineshop", "de-CH": "Onlineshop", en: "Online shop", fr: "Boutique en ligne", pt: "Loja online" },
p2_ausgang: {
de: "Handgemachte Häkelwerke, Plushies und Bastelzubehör wurden bis dahin über Nachrichten verkauft: Preis nachfragen, Verfügbarkeit klären, Versand einzeln absprechen. Das kostete pro Bestellung mehr Zeit als das Herstellen mancher Artikel.",
"de-CH": "Handgmachti Häkelwärch, Plushies und Bastelzubehör sind bis dete über Nachrichte verchauft worde: Priis nachefroge, Verfüegbarkeit kläre, Versand einzeln abspräche. Das het pro Bstellig meh Ziit choschtet als s Herstelle vo mängem Artikel.",
en: "Handmade crochet work, plushies and craft supplies were sold via messages until then: ask for the price, clarify availability, arrange shipping individually. That cost more time per order than making some of the items.",
fr: "Les créations au crochet, peluches et fournitures créatives se vendaient jusque-là par messages : demander le prix, vérifier la disponibilité, convenir de l'expédition au cas par cas. Cela coûtait plus de temps par commande que la fabrication de certains articles.",
pt: "Peças de crochet feitas à mão, plushies e material de artesanato eram vendidos por mensagens: perguntar o preço, confirmar a disponibilidade, combinar o envio caso a caso. Isso custava mais tempo por encomenda do que produzir alguns dos artigos.",
},
p2_loesung: {
de: "Ein vollständiger Shop mit Kategorien, Artikeln samt Varianten, Warenkorb, Gutscheincodes und Versandregeln — und ein Adminbereich, der bewusst so gebaut wurde, dass die Inhaberin ihn ohne Technikkenntnisse bedient. Die Kategorien sind dort standardmäßig zugeklappt, damit die Artikelliste nicht erschlägt.",
"de-CH": "En vollständige Shop mit Kategorie, Artikel samt Variante, Warechorb, Gutscheincodes und Versandregle — und en Adminbereich, wo bewusst so baut worde isch, dass d Inhaberin ihn ohni Technikkenntnis bediene cha. D Kategorie sind dete standardmässig zueklappt, damit d Artikellischte nöd erschloht.",
en: "A complete shop with categories, items including variants, basket, voucher codes and shipping rules — plus an admin area deliberately built so the owner operates it without technical knowledge. Categories there are collapsed by default so the item list is not overwhelming.",
fr: "Une boutique complète avec catégories, articles et variantes, panier, codes promo et règles d'expédition — et un espace d'administration conçu pour que la propriétaire l'utilise sans compétences techniques. Les catégories y sont repliées par défaut afin que la liste d'articles ne submerge pas.",
pt: "Uma loja completa com categorias, artigos e variantes, carrinho, códigos de desconto e regras de envio — e uma área de administração propositadamente feita para que a proprietária a use sem conhecimentos técnicos. As categorias estão recolhidas por defeito para a lista de artigos não ser esmagadora.",
},
p2_ergebnis: {
de: "Artikel werden selbstständig angelegt und gepflegt, ohne Rückfrage und ohne Wartezeit. Bestellungen laufen strukturiert ein statt als lose Nachrichten. Die Seite läuft auf eigener Domain und eigenem Server.",
"de-CH": "Artikel wärded sälbstständig aagleit und pflegt, ohni Rückfrog und ohni Wartziit. Bstellige laufed strukturiert ii statt als losi Nachrichte. D Site lauft uf eigener Domain und eigenem Server.",
en: "Items are created and maintained independently, without asking and without waiting. Orders come in structured instead of as loose messages. The site runs on its own domain and its own server.",
fr: "Les articles sont créés et gérés en autonomie, sans demande préalable ni attente. Les commandes arrivent structurées au lieu de messages épars. Le site tourne sur son propre domaine et son propre serveur.",
pt: "Os artigos são criados e geridos de forma autónoma, sem perguntar e sem esperar. As encomendas chegam estruturadas em vez de mensagens soltas. O site corre em domínio e servidor próprios.",
},
p2_f1: { de: "Kategorien, Artikel und Varianten", "de-CH": "Kategorie, Artikel und Variante", en: "Categories, items and variants", fr: "Catégories, articles et variantes", pt: "Categorias, artigos e variantes" },
p2_f2: { de: "Warenkorb und Kasse, auf dem Handy geprüft", "de-CH": "Warechorb und Kasse, uf em Handy prüeft", en: "Basket and checkout, tested on mobile", fr: "Panier et paiement, testés sur mobile", pt: "Carrinho e finalização, testados em telemóvel" },
p2_f3: { de: "Gutscheincodes und Versandregeln", "de-CH": "Gutscheincodes und Versandregle", en: "Voucher codes and shipping rules", fr: "Codes promo et règles d'expédition", pt: "Códigos de desconto e regras de envio" },
p2_f4: { de: "Adminbereich für die eigenständige Artikelpflege", "de-CH": "Adminbereich für d sälbstständigi Artikelpflege", en: "Admin area for maintaining items independently", fr: "Espace d'administration pour gérer les articles en autonomie", pt: "Área de administração para gerir artigos de forma autónoma" },
p2_f5: { de: "Mehrsprachig", "de-CH": "Mehrsprachig", en: "Multilingual", fr: "Multilingue", pt: "Multilíngue" },
p2_stil: {
de: "Dunkel mit warmen Violett- und Rosétönen, passend zum handgemachten Sortiment.",
"de-CH": "Dunkel mit warme Violett- und Rosétöne, passend zum handgmachte Sortimänt.",
en: "Dark with warm violet and rosé tones, matching the handmade range.",
fr: "Sombre avec des tons violets et rosés chauds, en accord avec l'assortiment fait main.",
pt: "Escuro com tons quentes de violeta e rosé, a condizer com a gama feita à mão.",
},
pf_regeln_titel: {
de: "Was hier bewusst fehlt",
"de-CH": "Was do bewusst fählt",
en: "What is deliberately missing here",
fr: "Ce qui manque ici volontairement",
pt: "O que falta aqui de propósito",
},
pf_regeln_text: {
de: "Es steht kein einziges Kundenzitat auf dieser Seite. Nicht, weil es keine zufriedenen Kunden gäbe, sondern weil noch niemand ein Zitat geschrieben und freigegeben hat — und erfundene Bewertungen kommen hier grundsätzlich nicht vor. Sobald echte da sind, stehen sie hier. Vorher lieber eine leere Stelle als eine erfundene.",
"de-CH": "Es stoht kes einzigs Kundezitat uf dere Site. Nöd, wil s kei zfriedene Chunde gäb, sondern wil no niemert es Zitat gschriebe und freigäh het — und erfundeni Bewärtige chömed do grundsätzlich nöd vor. Sobald ächti do sind, stöhnd si do. Vorher lieber e läeri Stell als e erfundeni.",
en: "There is not a single customer quote on this page. Not because there are no satisfied customers, but because nobody has written and approved a quote yet — and invented reviews do not appear here on principle. As soon as real ones exist, they will be here. Until then, an empty spot is preferable to a fabricated one.",
fr: "Aucune citation client ne figure sur cette page. Non pas faute de clients satisfaits, mais parce que personne n'a encore rédigé et validé de témoignage — et les avis inventés n'ont pas leur place ici, par principe. Dès qu'il y en aura de véritables, ils seront ici. En attendant, mieux vaut un espace vide qu'un faux.",
pt: "Não há uma única citação de cliente nesta página. Não por falta de clientes satisfeitos, mas porque ainda ninguém escreveu e aprovou um depoimento — e avaliações inventadas não aparecem aqui por princípio. Assim que existirem reais, estarão aqui. Até lá, prefiro um espaço vazio a um inventado.",
},
pf_cta_h2: {
de: "Soll deins das dritte sein?",
"de-CH": "Söll dis s dritte si?",
en: "Shall yours be the third?",
fr: "Le tien sera-t-il le troisième ?",
pt: "O teu vai ser o terceiro?",
},
pf_cta_p: {
de: "Ob dein Projekt hier später auftaucht, entscheidest ausschließlich du — die Aufnahme ins Portfolio ist von der Veröffentlichung deiner Seite getrennt und braucht deine ausdrückliche Erlaubnis.",
"de-CH": "Ob dis Projekt do spöter uftaucht, entscheidsch uusschliesslich du — d Ufnahm is Portfolio isch vo dr Veröffentlichig vo dinere Site trennt und bruucht dini uusdrücklichi Erlaubnis.",
en: "Whether your project appears here later is entirely your decision — inclusion in the portfolio is separate from publishing your site and requires your explicit permission.",
fr: "Que ton projet apparaisse ici plus tard ne dépend que de toi — l'ajout au portfolio est indépendant de la mise en ligne de ton site et requiert ton autorisation explicite.",
pt: "Se o teu projeto aparece aqui mais tarde é decisão exclusivamente tua — a inclusão no portfólio é separada da publicação do teu site e exige a tua autorização explícita.",
},
};