Gemeldet 22.08.2026 mit Bildschirmfoto: "immer noch so" -- das Logo im
Marken-Intro stand weiterhin hochkant gestreckt da, obwohl die Korrektur
(height:auto gegen die height-Attribute) laengst live war.
Ursache war NICHT die Korrektur, sondern mein eigener Service Worker. Er
lief fuer /assets/ als "stale-while-revalidate": die gespeicherte Fassung
geht sofort raus, im Hintergrund wird eine frische geholt. Das ist schnell
-- bedeutet aber, dass jede Aenderung an CSS oder JavaScript beim ersten
Aufruf unsichtbar bleibt und erst beim zweiten wirkt. Ein behobener Fehler
sieht dadurch aus wie ein nicht behobener. Die unangenehmste Sorte.
Nachgemessen ist das Logo jetzt 160x161px bei einem natuerlichen
Verhaeltnis von 472x476 -- also unverzerrt. Vorher erzwang das Attribut
height="476" bei 160px Breite ein Verhaeltnis von 0,34 statt 0,99, genau
das lange Gesicht auf dem Bildschirmfoto.
Behoben:
- Stilvorlagen und Skripte laufen jetzt "Netz zuerst", Zwischenspeicher
nur als Notfallnetz. Richtigkeit vor Millisekunden.
- Bilder und Symbole bleiben beim schnellen Weg -- die aendern sich
praktisch nie und bekaemen sonst einen neuen Dateinamen.
- CACHE_NAME auf v2 gesetzt, damit der alte Speicher beim naechsten Start
vollstaendig weggeworfen wird.
- Versionsnummer an allen CSS/JS-Verweisen hochgesetzt, damit es sich auch
ohne Service Worker sofort selbst heilt.
Ausserdem: Woerterbuch fuer das Anfrageformular, 101 Textbausteine in fuenf
Sprachen (vier Schritte, Zusammenfassung, Fehlermeldungen).
Co-Authored-By: Claude Opus 5 <[email protected]>
af_verwerfen:{de:"Neu anfangen","de-CH":"Neu aafange",en:"Start over",fr:"Recommencer",pt:"Começar de novo"},
/* ---------------- Schritt 1 ---------------- */
af1_h2:{
de:"Worum geht es ungefähr?",
"de-CH":"Um was gohts öppe?",
en:"What is this roughly about?",
fr:"De quoi s'agit-il en gros ?",
pt:"De que se trata, mais ou menos?",
},
af1_paket_label:{de:"Art des Projekts","de-CH":"Art vom Projekt",en:"Type of project",fr:"Type de projet",pt:"Tipo de projeto"},
af1_paket_hilfe:{
de:"Nur eine grobe Richtung — wenn du unsicher bist, wähle das Letzte. Das ist völlig in Ordnung und kostet nichts extra.",
"de-CH":"Nur e grobi Richtig — wenn du unsicher bisch, wähl s letschte. Das isch völlig i Ornig und choschtet nüt extra.",
en:"Just a rough direction — if you are unsure, pick the last option. That is completely fine and costs nothing extra.",
fr:"Juste une direction générale — si tu hésites, choisis la dernière option. C'est parfaitement normal et sans surcoût.",
pt:"Apenas uma direção aproximada — se tiveres dúvidas, escolhe a última opção. Não há problema nenhum nem custo extra.",
},
af1_unklar:{de:"Ich weiß es noch nicht","de-CH":"Ich weiss es no nöd",en:"I don't know yet",fr:"Je ne sais pas encore",pt:"Ainda não sei"},
af1_unklar_text:{
de:"Wir finden im Gespräch heraus, was passt.",
"de-CH":"Mir finded im Gspröch use, was passt.",
en:"We will work out what fits in a conversation.",
fr:"Nous déterminerons ensemble ce qui convient.",
pt:"Descobrimos numa conversa o que encaixa.",
},
af1_ziel_label:{de:"Was soll die Seite erreichen?","de-CH":"Was söll d Site erreiche?",en:"What should the site achieve?",fr:"Que doit accomplir le site ?",pt:"O que deve o site alcançar?"},
af1_ziel_hilfe:{
de:"Ein, zwei Sätze reichen. Beispiel: „Kunden sollen mich finden und direkt einen Termin anfragen können.“",
"de-CH":"Ei, zwei Sätz länged. Bispiel: „Chunde söled mich finde und grad en Termin aafroge chönne.“",
en:"One or two sentences are enough. Example: “Customers should find me and be able to request an appointment directly.”",
fr:"Une ou deux phrases suffisent. Exemple : « Les clients doivent me trouver et pouvoir demander un rendez-vous. »",
pt:"Uma ou duas frases chegam. Exemplo: “Os clientes devem encontrar-me e poder pedir uma marcação.”",
},
af1_ziel_platzhalter:{
de:"z. B. Kunden sollen mich finden und direkt anfragen können",
"de-CH":"z. B. Chunde söled mich finde und grad aafroge chönne",
en:"e.g. customers should find me and be able to enquire directly",
fr:"p. ex. les clients doivent me trouver et pouvoir me contacter",
pt:"p. ex. os clientes devem encontrar-me e poder contactar-me",
},
af1_zielgruppe_label:{de:"Wer sind deine Kunden?","de-CH":"Wär sind dini Chunde?",en:"Who are your customers?",fr:"Qui sont tes clients ?",pt:"Quem são os teus clientes?"},
af1_zielgruppe_platzhalter:{
de:"z. B. Privatkunden aus der Region, 30–60 Jahre",
"de-CH":"z. B. Privatchunde us dr Region, 30–60 Jahr",
en:"e.g. private customers in the region, aged 30–60",
fr:"p. ex. particuliers de la région, 30 à 60 ans",
pt:"p. ex. clientes particulares da região, 30–60 anos",
},
/* ---------------- Schritt 2 ---------------- */
af2_h2:{
de:"Wie groß soll es werden?",
"de-CH":"Wie gross söll s wärde?",
en:"How big should it be?",
fr:"Quelle ampleur ?",
pt:"Que dimensão deve ter?",
},
af2_seiten_label:{de:"Welche Bereiche brauchst du?","de-CH":"Weli Bereich bruuchsch?",en:"Which sections do you need?",fr:"Quelles sections te faut-il ?",pt:"De que secções precisas?"},
af2_seiten_platzhalter:{
de:"z. B. Start, Leistungen, Über uns, Kontakt",
"de-CH":"z. B. Start, Leischtige, Über üs, Kontakt",
en:"e.g. home, services, about, contact",
fr:"p. ex. accueil, prestations, à propos, contact",
pt:"p. ex. início, serviços, sobre, contacto",
},
af2_funktionen_label:{de:"Was soll die Seite können?","de-CH":"Was söll d Site chöne?",en:"What should the site be able to do?",fr:"Que doit pouvoir faire le site ?",pt:"O que deve o site conseguir fazer?"},
af2_funktionen_hilfe:{
de:"Alles, was du hier ankreuzt, wird im Angebot berücksichtigt. Nichts davon ist Pflicht.",
"de-CH":"Alles, wo du do aachrüzisch, wird im Aagebot berücksichtigt. Nüt devo isch Pflicht.",
en:"Everything you tick here is accounted for in the quote. None of it is mandatory.",
fr:"Tout ce que tu coches ici est pris en compte dans le devis. Rien n'est obligatoire.",
pt:"Tudo o que marcares aqui entra no orçamento. Nada disto é obrigatório.",
},
af2_f_kontakt:{de:"Kontaktformular","de-CH":"Kontaktformular",en:"Contact form",fr:"Formulaire de contact",pt:"Formulário de contacto"},
af2_f_galerie:{de:"Bildergalerie","de-CH":"Bildergalerie",en:"Image gallery",fr:"Galerie d'images",pt:"Galeria de imagens"},
af2_f_termin:{de:"Terminbuchung","de-CH":"Terminbuechig",en:"Appointment booking",fr:"Prise de rendez-vous",pt:"Marcação de horários"},
af2_f_shop:{de:"Produkte verkaufen","de-CH":"Produkt verchaufe",en:"Selling products",fr:"Vente de produits",pt:"Venda de produtos"},
af2_f_login:{de:"Geschützter Kundenbereich","de-CH":"Gschützte Chundebereich",en:"Protected customer area",fr:"Espace client protégé",pt:"Área de cliente protegida"},
af2_f_blog:{de:"Blog oder Neuigkeiten","de-CH":"Blog oder Neuigkeite",en:"Blog or news",fr:"Blog ou actualités",pt:"Blogue ou novidades"},
af2_f_app:{de:"Als App installierbar","de-CH":"Als App installierbar",en:"Installable as an app",fr:"Installable comme application",pt:"Instalável como aplicação"},
af2_shop_h3:{de:"Zum Verkauf","de-CH":"Zum Verchauf",en:"About selling",fr:"À propos de la vente",pt:"Sobre a venda"},
af2_shop_anzahl:{de:"Wie viele Produkte ungefähr?","de-CH":"Wie viili Produkt öppe?",en:"Roughly how many products?",fr:"Combien de produits environ ?",pt:"Quantos produtos, mais ou menos?"},
af2_shop_versand:{de:"Verschickst du selbst?","de-CH":"Verschicksch sälber?",en:"Do you ship yourself?",fr:"Expédies-tu toi-même ?",pt:"Envias tu próprio?"},
af2_shop_zahlung:{de:"Gewünschte Zahlungsarten","de-CH":"Gwünschti Zahligsarte",en:"Preferred payment methods",fr:"Moyens de paiement souhaités",pt:"Métodos de pagamento pretendidos"},
af2_vw_h3:{de:"Zur Verwaltung","de-CH":"Zur Verwaltig",en:"About the admin area",fr:"À propos de l'administration",pt:"Sobre a administração"},
af2_vw_rollen:{de:"Wie viele Personen arbeiten damit?","de-CH":"Wie viili Persone schaffed demit?",en:"How many people will work with it?",fr:"Combien de personnes l'utiliseront ?",pt:"Quantas pessoas vão trabalhar com isso?"},
af2_vw_dokumente:{de:"Welche Unterlagen sollen hinein?","de-CH":"Weli Unterlage söled ine?",en:"Which documents should go in?",fr:"Quels documents doivent y figurer ?",pt:"Que documentos devem entrar?"},
/* ---------------- Schritt 3 ---------------- */
af3_h2:{
de:"Was hast du schon, und was ist der Rahmen?",
"de-CH":"Was hesch scho, und was isch dr Rahme?",
en:"What do you already have, and what is the frame?",
fr:"Qu'as-tu déjà, et quel est le cadre ?",
pt:"O que já tens e qual é o enquadramento?",
},
af3_hilfe:{
de:"Bitte ehrlich antworten — fehlende Texte und Bilder sind der häufigste Grund, warum Projekte länger dauern. Wenn ich es vorher weiß, planen wir es ein, statt später überrascht zu werden.",
"de-CH":"Bitte ehrlich antworte — fählendi Täxt und Bilder sind dr hüüfigscht Grund, wieso Projekt länger duured. Wenn i s vorher weiss, plane mers ii, statt spöter überrascht z wärde.",
en:"Please answer honestly — missing texts and images are the most common reason projects take longer. If I know beforehand, we plan for it instead of being surprised later.",
fr:"Réponds honnêtement — l'absence de textes et d'images est la première cause de retard. Si je le sais à l'avance, nous l'intégrons au planning.",
pt:"Responde honestamente — a falta de textos e imagens é a causa mais comum de atrasos. Se eu souber antes, planeamos isso em vez de sermos surpreendidos.",
af3_budget_label:{de:"Welcher Rahmen ist realistisch?","de-CH":"Wele Rahme isch realistisch?",en:"What budget is realistic?",fr:"Quel budget est réaliste ?",pt:"Que orçamento é realista?"},
af3_budget_hilfe:{
de:"Keine Bindung — die Angabe hilft nur, dir kein Angebot zu schreiben, das an deinem Rahmen vorbeigeht.",
"de-CH":"Kei Bindig — d Aagab hilft nur, dir kes Aagebot z schriibe, wo a dim Rahme verbii goht.",
en:"Not binding — it only helps to avoid writing you a quote that misses your budget entirely.",
fr:"Sans engagement — cela évite simplement de te proposer un devis hors de ton budget.",
pt:"Sem compromisso — serve apenas para não te enviar um orçamento completamente fora do teu alcance.",
af3_budget_4:{de:"über 2.500 €","de-CH":"über 2.500 €",en:"over €2,500",fr:"plus de 2 500 €",pt:"mais de 2.500 €"},
af3_budget_5:{de:"Weiß ich noch nicht","de-CH":"Weiss i no nöd",en:"I don't know yet",fr:"Je ne sais pas encore",pt:"Ainda não sei"},
af3_termin_label:{de:"Bis wann sollte es fertig sein?","de-CH":"Bis wenn sött s fertig si?",en:"By when should it be ready?",fr:"Pour quand ?",pt:"Para quando deve estar pronto?"},
af3_termin_hilfe:{
de:"Die Zeitrahmen auf der Preisseite gelten ab Eingang der Anzahlung, nicht ab heute.",
"de-CH":"D Ziitrahme uf dr Priissite gälted ab em Iigang vo dr Aazahlig, nöd ab hüt.",
en:"The timeframes on the pricing page start when the deposit arrives, not today.",
fr:"Les délais indiqués courent à partir de la réception de l'acompte, pas d'aujourd'hui.",
pt:"Os prazos indicados contam a partir da entrada do sinal, não a partir de hoje.",
},
/* ---------------- Schritt 4 ---------------- */
af4_h2:{de:"Wie erreiche ich dich?","de-CH":"Wie erreiche ich dich?",en:"How do I reach you?",fr:"Comment te joindre ?",pt:"Como te contacto?"},
af4_name_platzhalter:{de:"Vor- und Nachname oder Firma","de-CH":"Vor- und Nachname oder Firma",en:"First and last name, or company",fr:"Prénom et nom, ou société",pt:"Nome próprio e apelido, ou empresa"},
af4_weg:{de:"Wie darf ich mich melden?","de-CH":"Wie dörf i mich mälde?",en:"How may I get back to you?",fr:"Comment puis-je te répondre ?",pt:"Como posso responder-te?"},
af4_bemerkung:{de:"Noch etwas, das ich wissen sollte?","de-CH":"No öppis, wo i wüsse sött?",en:"Anything else I should know?",fr:"Autre chose à savoir ?",pt:"Mais alguma coisa que eu deva saber?"},
af4_bemerkung_hilfe:{
de:"Auch Fragen an mich gehören hier hinein.",
"de-CH":"Au Froge a mich ghöred do ine.",
en:"Questions for me belong here too.",
fr:"Tes questions pour moi ont aussi leur place ici.",
pt:"Perguntas para mim também cabem aqui.",
},
af4_datenschutz:{
de:"Ich bin damit einverstanden, dass meine Angaben zur Bearbeitung dieser Anfrage gespeichert werden. Sie werden nicht weitergegeben und können jederzeit gelöscht werden.",
"de-CH":"Ich bi demit iiverstande, dass mini Aagabe zur Bearbeitig vo dere Aafrog gspeicheret wärded. Si wärded nöd wiitergäh und chönd jederziit glöscht wärde.",
en:"I agree that my details may be stored to process this enquiry. They will not be passed on and can be deleted at any time.",
fr:"J'accepte que mes données soient conservées pour traiter cette demande. Elles ne seront pas transmises et peuvent être supprimées à tout moment.",
pt:"Concordo que os meus dados sejam guardados para tratar este pedido. Não serão partilhados e podem ser apagados a qualquer momento.",
},
af4_datenschutz_link:{de:"Datenschutz nachlesen","de-CH":"Dateschutz nacheläse",en:"Read the privacy notice",fr:"Lire la politique de confidentialité",pt:"Ler a política de privacidade"},
/* --- Zusammenfassung --- */
af_zus_h2:{
de:"Passt alles so?",
"de-CH":"Passt alles so?",
en:"Does everything look right?",
fr:"Tout est correct ?",
pt:"Está tudo certo?",
},
af_zus_hilfe:{
de:"Das schickst du ab. Du kannst jeden Punkt noch ändern.",
"de-CH":"Das schicksch ab. Du chasch jede Punkt no ändere.",
en:"This is what you are sending. You can still change any item.",
fr:"Voici ce que tu envoies. Tu peux encore modifier chaque point.",
pt:"É isto que vais enviar. Ainda podes alterar qualquer ponto.",
de:"Mit dem Absenden entsteht kein Vertrag und keine Zahlungspflicht. Du bekommst zuerst ein schriftliches Angebot und entscheidest dann in Ruhe.",
"de-CH":"Mit em Abschicke entstoht kein Vertrag und kei Zahligspflicht. Du überchunnsch zerscht es schriftlichs Aagebot und entscheidsch denn i Rueh.",
en:"Sending this creates no contract and no obligation to pay. You first receive a written quote and then decide at your own pace.",
fr:"L'envoi ne crée ni contrat ni obligation de paiement. Tu reçois d'abord un devis écrit et décides ensuite tranquillement.",
pt:"Enviar isto não cria contrato nem obrigação de pagamento. Recebes primeiro um orçamento escrito e decides com calma.",
},
/* --- Nach dem Absenden --- */
af_danke_h2:{
de:"Angekommen!",
"de-CH":"Aacho!",
en:"Received!",
fr:"Bien reçu !",
pt:"Recebido!",
},
af_danke_text:{
de:"Deine Anfrage liegt bei mir. Ich melde mich innerhalb weniger Tage — entweder mit Rückfragen oder direkt mit einem Angebot.",
"de-CH":"Dini Aafrog ligt bi mir. Ich mälde mich innert weniger Täg — entweder mit Rückfroge oder grad mit eme Aagebot.",
en:"Your enquiry has reached me. I will get back to you within a few days — either with questions or directly with a quote.",
fr:"Ta demande m'est parvenue. Je reviens vers toi sous quelques jours — avec des questions ou directement un devis.",
pt:"O teu pedido chegou-me. Volto a contactar-te dentro de poucos dias — com perguntas ou diretamente com um orçamento.",
},
af_danke_nummer:{
de:"Deine Anfragenummer",
"de-CH":"Dini Aafrognummere",
en:"Your enquiry number",
fr:"Ton numéro de demande",
pt:"O teu número de pedido",
},
af_danke_notieren:{
de:"Notier sie dir — mit dieser Nummer findest du deine Anfrage sofort wieder, wenn du nachfragst.",
"de-CH":"Schriib sie dir uf — mit dere Nummere findsch dini Aafrog sofort wieder, wenn du nachefrogsch.",
en:"Note it down — with this number your enquiry is found immediately if you follow up.",
fr:"Note-le — avec ce numéro, ta demande est retrouvée immédiatement si tu nous relances.",
pt:"Aponta-o — com este número o teu pedido é encontrado de imediato se voltares a contactar.",
},
af_danke_zurueck:{de:"Zurück zur Startseite","de-CH":"Zrugg zur Startsite",en:"Back to the home page",fr:"Retour à l'accueil",pt:"Voltar ao início"},
/* --- Fehlermeldungen --- */
af_fehler_name:{de:"Bitte gib deinen Namen an.","de-CH":"Bitte gib din Name aa.",en:"Please enter your name.",fr:"Merci d'indiquer ton nom.",pt:"Indica o teu nome."},
af_fehler_email:{de:"Bitte gib eine gültige E-Mail-Adresse an.","de-CH":"Bitte gib e gültigi E-Mail-Adress aa.",en:"Please enter a valid e-mail address.",fr:"Merci d'indiquer une adresse e-mail valide.",pt:"Indica um endereço de e-mail válido."},
af_fehler_paket:{de:"Bitte wähle aus, worum es ungefähr geht.","de-CH":"Bitte wähl us, um was es öppe goht.",en:"Please choose what this is roughly about.",fr:"Merci de choisir de quoi il s'agit.",pt:"Escolhe de que se trata, aproximadamente."},
af_fehler_ziel:{de:"Bitte beschreib kurz, was die Seite erreichen soll.","de-CH":"Bitte beschriib churz, was d Site erreiche söll.",en:"Please describe briefly what the site should achieve.",fr:"Décris brièvement l'objectif du site.",pt:"Descreve brevemente o que o site deve alcançar."},
af_fehler_datenschutz:{de:"Ohne diese Zustimmung dürfen wir deine Angaben nicht speichern.","de-CH":"Ohni die Zuestimmig dörfed mir dini Aagabe nöd speichere.",en:"Without this consent we may not store your details.",fr:"Sans ce consentement, nous ne pouvons pas conserver tes données.",pt:"Sem este consentimento não podemos guardar os teus dados."},
af_fehler_telefon:{
de:"Du möchtest telefonisch kontaktiert werden — bitte gib dafür eine Nummer an.",
"de-CH":"Du wottsch telefonisch kontaktiert wärde — bitte gib defür e Nummere aa.",
en:"You asked to be contacted by phone — please provide a number.",
fr:"Tu souhaites être contacté par téléphone — merci d'indiquer un numéro.",
pt:"Pediste contacto por telefone — indica um número.",
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.