Wunsch: "ich will dass du es abcheckst" — nicht Stück für Stück (das war
schon geprüft), sondern EINMAL DURCHGÄNGIG als ein zusammenhängender
Ablauf, so wie ein echter Auftrag tatsächlich läuft: Anfrage → Angebot
→ Zusage im Portal → Anzahlung → laufende Uhr → Benachrichtigung →
Arbeit → Restzahlung → Gegenprobe mit Abbruch.
test-kette.mjs bildet genau das ab, gegen die echten Funktionen aus
server-internal/, mit einer Wegwerf-Datenbank. 40 Prüfungen, alle grün.
DABEI GEFUNDEN: Der Liefertermin-Countdown im Portal prüfte nicht, ob
die Uhr überhaupt schon läuft. Ein frisch zugesagtes Projekt hat schon
ein termin_am (aus der Zusage vorgerechnet), aber uhr_start_am steht
noch auf null, solange die Anzahlung nicht da ist. Der Kunde hätte also
direkt nach der Zusage einen tickenden Countdown gesehen — und wenn die
Anzahlung eintrifft, wird der Termin ab dem Zahlungstag NEU berechnet
und springt dann sichtbar nach hinten. Das sieht aus wie ein Fehler,
auch wenn die Zahl rechnerisch stimmt: Kaum zu erklären, warum "noch 8
Tage" plötzlich wieder "noch 10 Tage" werden.
Jetzt zwei klar getrennte Zustände: Vor der Anzahlung steht "Startet,
sobald deine Anzahlung da ist — voraussichtlicher Liefertermin danach:
ca. {datum}" (kein Countdown, aber der Termin bleibt sichtbar, kein
Verstecken). Danach der echte Countdown. Fünf Sprachen ergänzt.
Nebenbei einen irreführenden Kommentar korrigiert: Ein neuer Kunde wird
beim Angebot-Senden SOFORT freigeschaltet (nicht erst bei Zusage, wie
der alte Kommentar behauptete) — sonst könnte er sich gar nicht
einloggen, um sein eigenes Angebot anzusehen. Der Code war richtig,
nur die Erklärung falsch, und mein erster Testentwurf ist genau darauf
hereingefallen.
Bei der Gelegenheit auch die bekannte better-sqlite3-Aussetzer-Eigenart
(zufälliger Absturz beim Prozessende, dokumentiert seit früheren
Commits) noch einmal eingegrenzt: Derselbe Import in test-angebote.mjs
brach mal nach "GEHEIM", mal nach "VORLAGEN" ab — der Absturzpunkt
verschiebt sich zwischen identischen Läufen. Das ist der endgültige
Beweis, dass es reine GC-Zeitfensterflakiness in der nativen
Bibliothek ist, kein Fehler im eigenen Code.
Geprüft: 40 (Kette) + 55 + 56 + 70 + 28 + 49 serverseitig (alle
mehrfach unabhängig grün), 261 im Browser (Portal, Angebot, Übersicht,
Verwaltung, Abbruch, Design). Ein Screenshot bestätigt den neuen
Wartehinweis visuell.
511 lines
30 KiB
JavaScript
511 lines
30 KiB
JavaScript
/* =====================================================================
|
||
i18n-wd-portal.js — Kundenportal (Masterplan S.12), fünf Sprachen.
|
||
|
||
Anders als die Verwaltung ist das Portal mehrsprachig: hier landen
|
||
Kunden, und die können Franzosen oder Portugiesen sein. Die Sprache
|
||
folgt derselben Auswahl wie auf der öffentlichen Seite.
|
||
===================================================================== */
|
||
window.I18N_WD = {
|
||
seiten_titel: {
|
||
de: "Kundenportal — Dogfather Webdesign",
|
||
"de-CH": "Kundeportal — Dogfather Webdesign",
|
||
en: "Client portal — Dogfather Web Design",
|
||
fr: "Espace client — Dogfather Web Design",
|
||
pt: "Portal do cliente — Dogfather Web Design",
|
||
},
|
||
|
||
/* ---------- Anmeldung ---------- */
|
||
po_login_h1: { de: "Dein Projektraum", "de-CH": "Din Projektruum", en: "Your project space", fr: "Ton espace projet", pt: "O teu espaço de projeto" },
|
||
po_login_text: {
|
||
de: "Hier siehst du deinen Projektstand, alle Dateien und offene Punkte. Zugangsdaten bekommst du von Dogfather, sobald dein Projekt startet.",
|
||
"de-CH": "Do gsehsch din Projektstand, alli Datei und offni Pünkt. Zuegangsdate überchunnsch vom Dogfather, sobald dis Projekt startet.",
|
||
en: "Here you see your project status, all files and open points. You receive your access details from Dogfather once your project starts.",
|
||
fr: "Ici tu vois l'état de ton projet, tous les fichiers et les points ouverts. Tes accès te sont remis par Dogfather au démarrage du projet.",
|
||
pt: "Aqui vês o estado do teu projeto, todos os ficheiros e pontos em aberto. Recebes os teus acessos do Dogfather quando o projeto arrancar.",
|
||
},
|
||
po_email: { de: "E-Mail", "de-CH": "E-Mail", en: "E-mail", fr: "E-mail", pt: "E-mail" },
|
||
po_passwort: { de: "Passwort", "de-CH": "Passwort", en: "Password", fr: "Mot de passe", pt: "Palavra-passe" },
|
||
po_anmelden: { de: "Anmelden", "de-CH": "Aamälde", en: "Sign in", fr: "Se connecter", pt: "Entrar" },
|
||
po_anmelden_laeuft: { de: "Wird geprüft…", "de-CH": "Wird prüeft…", en: "Checking…", fr: "Vérification…", pt: "A verificar…" },
|
||
po_abmelden: { de: "Abmelden", "de-CH": "Abmälde", en: "Sign out", fr: "Se déconnecter", pt: "Sair" },
|
||
po_login_leer: {
|
||
de: "Bitte E-Mail und Passwort eingeben.",
|
||
"de-CH": "Bitte E-Mail und Passwort iigäh.",
|
||
en: "Please enter e-mail and password.",
|
||
fr: "Merci de saisir l'e-mail et le mot de passe.",
|
||
pt: "Introduz o e-mail e a palavra-passe.",
|
||
},
|
||
po_kein_zugang: {
|
||
de: "Noch keinen Zugang? Der Projektraum wird freigeschaltet, sobald dein Projekt oder deine Betreuung beginnt.",
|
||
"de-CH": "No kein Zuegang? Dr Projektruum wird freigschalte, sobald dis Projekt oder dini Betreuig aafoht.",
|
||
en: "No access yet? The project space is unlocked once your project or support plan begins.",
|
||
fr: "Pas encore d'accès ? L'espace projet est activé dès le démarrage de ton projet ou de ton suivi.",
|
||
pt: "Ainda sem acesso? O espaço de projeto é ativado quando o teu projeto ou acompanhamento começar.",
|
||
},
|
||
|
||
/* ---------- Passwort setzen ---------- */
|
||
po_setz_h1: { de: "Passwort festlegen", "de-CH": "Passwort festleggä", en: "Set your password", fr: "Définir ton mot de passe", pt: "Definir a palavra-passe" },
|
||
po_setz_text: {
|
||
de: "Wähl ein Passwort für deinen Projektraum. Ein kurzer Satz ist sicherer und leichter zu merken als ein kryptisches Wort.",
|
||
"de-CH": "Wähl es Passwort für din Projektruum. En churze Satz isch sicherer und liechter z merke als es kryptischs Wort.",
|
||
en: "Choose a password for your project space. A short sentence is safer and easier to remember than a cryptic word.",
|
||
fr: "Choisis un mot de passe pour ton espace projet. Une courte phrase est plus sûre et plus facile à retenir qu'un mot cryptique.",
|
||
pt: "Escolhe uma palavra-passe para o teu espaço. Uma frase curta é mais segura e fácil de lembrar do que uma palavra críptica.",
|
||
},
|
||
po_setz_knopf: { de: "Passwort speichern", "de-CH": "Passwort speichere", en: "Save password", fr: "Enregistrer le mot de passe", pt: "Guardar palavra-passe" },
|
||
po_setz_fertig: {
|
||
de: "Passwort gespeichert. Du kannst dich jetzt anmelden.",
|
||
"de-CH": "Passwort gspeicheret. Du chasch dich jetzt aamälde.",
|
||
en: "Password saved. You can sign in now.",
|
||
fr: "Mot de passe enregistré. Tu peux te connecter.",
|
||
pt: "Palavra-passe guardada. Já podes entrar.",
|
||
},
|
||
|
||
/* ---------- Übersicht ---------- */
|
||
po_hallo: { de: "Hallo", "de-CH": "Hoi", en: "Hello", fr: "Bonjour", pt: "Olá" },
|
||
po_projekte: { de: "Deine Projekte", "de-CH": "Dini Projekt", en: "Your projects", fr: "Tes projets", pt: "Os teus projetos" },
|
||
po_keine_projekte: {
|
||
de: "Hier erscheint dein Projekt, sobald es angelegt ist.",
|
||
"de-CH": "Do erschiint dis Projekt, sobald es aagleit isch.",
|
||
en: "Your project appears here as soon as it is set up.",
|
||
fr: "Ton projet apparaîtra ici dès sa création.",
|
||
pt: "O teu projeto aparece aqui assim que for criado.",
|
||
},
|
||
/* --- Leerer Zustand: fuehrt, statt zu enttaeuschen --- */
|
||
po_vorschau: {
|
||
de: "Vorschau",
|
||
"de-CH": "Vorschau",
|
||
en: "Preview",
|
||
fr: "Aperçu",
|
||
pt: "Pré-visualização",
|
||
},
|
||
po_vorschau_titel: {
|
||
de: "So sieht dein Projekt hier aus",
|
||
"de-CH": "So gseht dis Projekt do us",
|
||
en: "This is how your project will look here",
|
||
fr: "Voici à quoi ressemblera ton projet",
|
||
pt: "É assim que o teu projeto vai aparecer aqui",
|
||
},
|
||
po_vorschau_schritt: {
|
||
de: "Entwurf ansehen und Rückmeldung geben",
|
||
"de-CH": "Entwurf aaluege und Rückmäldig gäh",
|
||
en: "Review the draft and give feedback",
|
||
fr: "Consulter la maquette et donner ton retour",
|
||
pt: "Ver o esboço e dar feedback",
|
||
},
|
||
|
||
/* Die vier Abschnitte des Prozesses. Dieselben vier Farben tragen die
|
||
Merkmalskacheln, die Phasenleiste und diese Legende — Farbe ist damit
|
||
Sprache, nicht Dekoration. */
|
||
po_k1: { de: "Start", "de-CH": "Start", en: "Start", fr: "Départ", pt: "Início" },
|
||
po_k2: { de: "Gestaltung", "de-CH": "Gstaltig", en: "Design", fr: "Conception", pt: "Design" },
|
||
po_k3: { de: "Umsetzung", "de-CH": "Umsetzig", en: "Build", fr: "Réalisation", pt: "Execução" },
|
||
po_k4: { de: "Abschluss", "de-CH": "Abschluss", en: "Completion", fr: "Finalisation", pt: "Conclusão" },
|
||
|
||
po_l_fertig: { de: "erledigt", "de-CH": "erledigt", en: "done", fr: "terminé", pt: "concluído" },
|
||
po_l_jetzt: { de: "läuft gerade", "de-CH": "lauft grad", en: "in progress", fr: "en cours", pt: "em curso" },
|
||
po_l_offen: { de: "kommt noch", "de-CH": "chunnt no", en: "still to come", fr: "à venir", pt: "ainda por vir" },
|
||
|
||
po_leer_h3: {
|
||
de: "Gleich geht es los",
|
||
"de-CH": "Glii gohts los",
|
||
en: "It starts soon",
|
||
fr: "Ça commence bientôt",
|
||
pt: "Está quase a começar",
|
||
},
|
||
po_leer_1: { de: "Projektstand", "de-CH": "Projektstand", en: "Project status", fr: "État du projet", pt: "Estado do projeto" },
|
||
po_leer_1t: {
|
||
de: "Eine Leiste zeigt dir jederzeit, in welcher Phase dein Projekt gerade ist — vom Briefing bis zur Übergabe.",
|
||
"de-CH": "E Leischte zeigt dir jederziit, i welere Phase dis Projekt grad isch — vom Briefing bis zur Übergab.",
|
||
en: "A bar shows you at any time which phase your project is in — from briefing to handover.",
|
||
fr: "Une barre t'indique à tout moment la phase de ton projet — du briefing à la remise.",
|
||
pt: "Uma barra mostra-te a qualquer momento em que fase está o teu projeto — do briefing à entrega.",
|
||
},
|
||
po_leer_2: { de: "Wer gerade dran ist", "de-CH": "Wär grad dra isch", en: "Whose turn it is", fr: "À qui le tour", pt: "De quem é a vez" },
|
||
po_leer_2t: {
|
||
de: "Du siehst sofort, ob gerade auf dich gewartet wird oder ob Dogfather am Zug ist. Kein Nachfragen nötig.",
|
||
"de-CH": "Du gsehsch sofort, ob grad uf dich gwartet wird oder ob dr Dogfather am Zug isch. Kes Nachefroge nötig.",
|
||
en: "You see immediately whether we are waiting for you or Dogfather is working on it. No need to ask.",
|
||
fr: "Tu vois immédiatement si l'on t'attend ou si Dogfather s'en occupe. Pas besoin de demander.",
|
||
pt: "Vês logo se estamos à tua espera ou se o Dogfather está a tratar. Sem precisares de perguntar.",
|
||
},
|
||
po_leer_3: { de: "Dateien und Nachrichten", "de-CH": "Datei und Nachrichte", en: "Files and messages", fr: "Fichiers et messages", pt: "Ficheiros e mensagens" },
|
||
po_leer_3t: {
|
||
de: "Angebote, Entwürfe und Freigaben liegen hier gebündelt — nichts geht in E-Mails unter.",
|
||
"de-CH": "Aagebot, Entwürf und Freigabe liged do bündlet — nüt goht i E-Mails under.",
|
||
en: "Quotes, drafts and approvals are kept together here — nothing gets lost in e-mails.",
|
||
fr: "Devis, maquettes et validations sont regroupés ici — rien ne se perd dans les e-mails.",
|
||
pt: "Orçamentos, esboços e aprovações ficam reunidos aqui — nada se perde em e-mails.",
|
||
},
|
||
po_leer_4: { de: "Ideen jederzeit", "de-CH": "Ideä jederziit", en: "Ideas anytime", fr: "Des idées à tout moment", pt: "Ideias a qualquer momento" },
|
||
po_leer_4t: {
|
||
de: "Fällt dir später etwas ein, trägst du es hier ein. Du bekommst Aufwand und Preis genannt und entscheidest in Ruhe.",
|
||
"de-CH": "Fallt dir spöter öppis ii, treisch es do ii. Du überchunnsch Ufwand und Priis gnennt und entscheidsch i Rueh.",
|
||
en: "If something occurs to you later, note it here. You get effort and price quoted and decide at your own pace.",
|
||
fr: "Si une idée te vient plus tard, note-la ici. Tu reçois l'effort et le prix, et tu décides tranquillement.",
|
||
pt: "Se te ocorrer algo mais tarde, aponta aqui. Recebes esforço e preço e decides com calma.",
|
||
},
|
||
po_leer_fuss: {
|
||
de: "Sobald dein Projekt angelegt ist, erscheint es automatisch hier — du musst nichts tun.",
|
||
"de-CH": "Sobald dis Projekt aagleit isch, erschiint es automatisch do — du muesch nüt mache.",
|
||
en: "As soon as your project is created it appears here automatically — you do not have to do anything.",
|
||
fr: "Dès que ton projet est créé, il apparaît ici automatiquement — tu n'as rien à faire.",
|
||
pt: "Assim que o teu projeto for criado, aparece aqui automaticamente — não tens de fazer nada.",
|
||
},
|
||
|
||
po_betreuung: { de: "Laufende Betreuung", "de-CH": "Laufendi Betreuig", en: "Ongoing support", fr: "Suivi en cours", pt: "Acompanhamento em curso" },
|
||
po_offene_zahlungen: { de: "Offene Zahlungen", "de-CH": "Offni Zahlige", en: "Open payments", fr: "Paiements en attente", pt: "Pagamentos em aberto" },
|
||
po_jetzt_bezahlen: { de: "Jetzt bezahlen", "de-CH": "Jetzt zahle", en: "Pay now", fr: "Payer maintenant", pt: "Pagar agora" },
|
||
po_naechste_zahlung: { de: "Nächste Zahlung", "de-CH": "Nöchsti Zahlig", en: "Next payment", fr: "Prochain paiement", pt: "Próximo pagamento" },
|
||
|
||
/* ---------- Projektstatus ---------- */
|
||
po_status: { de: "Stand", "de-CH": "Stand", en: "Status", fr: "État", pt: "Estado" },
|
||
po_st_briefing: { de: "Briefing", "de-CH": "Briefing", en: "Briefing", fr: "Briefing", pt: "Briefing" },
|
||
po_st_angebot: { de: "Angebot", "de-CH": "Aagebot", en: "Quote", fr: "Devis", pt: "Orçamento" },
|
||
po_st_design: { de: "Design", "de-CH": "Design", en: "Design", fr: "Design", pt: "Design" },
|
||
po_st_entwicklung: { de: "Entwicklung", "de-CH": "Entwicklig", en: "Development", fr: "Développement", pt: "Desenvolvimento" },
|
||
po_st_tests: { de: "Tests", "de-CH": "Teschts", en: "Testing", fr: "Tests", pt: "Testes" },
|
||
po_st_abnahme: { de: "Abnahme", "de-CH": "Abnahm", en: "Acceptance", fr: "Validation", pt: "Aceitação" },
|
||
po_st_uebergeben: { de: "Übergeben", "de-CH": "Übergäh", en: "Handed over", fr: "Remis", pt: "Entregue" },
|
||
po_st_pausiert: { de: "Pausiert", "de-CH": "Pausiert", en: "Paused", fr: "En pause", pt: "Em pausa" },
|
||
po_st_abgebrochen: { de: "Abgebrochen", "de-CH": "Abbroche", en: "Cancelled", fr: "Annulé", pt: "Cancelado" },
|
||
|
||
po_naechster_schritt: { de: "Nächster Schritt", "de-CH": "Nöchste Schritt", en: "Next step", fr: "Prochaine étape", pt: "Próximo passo" },
|
||
po_wartet_kunde: {
|
||
de: "Wir warten auf dich",
|
||
"de-CH": "Mir warted uf dich",
|
||
en: "Waiting for you",
|
||
fr: "En attente de ta part",
|
||
pt: "À espera de ti",
|
||
},
|
||
po_wartet_dogfather: {
|
||
de: "Dogfather ist dran",
|
||
"de-CH": "Dr Dogfather isch dra",
|
||
en: "Dogfather is working on it",
|
||
fr: "Dogfather s'en occupe",
|
||
pt: "O Dogfather está a tratar",
|
||
},
|
||
po_richttermin: { de: "Richttermin", "de-CH": "Richttermin", en: "Target date", fr: "Date cible", pt: "Data prevista" },
|
||
po_ag_neu: { de: "Angebot", "de-CH": "Angebot", en: "Offer", fr: "Devis", pt: "Proposta" },
|
||
po_ag_angenommen: { de: "angenommen", "de-CH": "angenommen", en: "accepted", fr: "accepté", pt: "aceite" },
|
||
po_ag_abgelaufen: { de: "abgelaufen", "de-CH": "abgelaufen", en: "expired", fr: "expiré", pt: "expirado" },
|
||
po_ag_anzahlung: {
|
||
de: "Anzahlung zum Start: {betrag} (30 %)",
|
||
"de-CH": "Anzahlung zum Start: {betrag} (30 %)",
|
||
en: "Deposit to start: {betrag} (30%)",
|
||
fr: "Acompte au démarrage : {betrag} (30 %)",
|
||
pt: "Sinal para começar: {betrag} (30 %)" },
|
||
po_ag_dauer: {
|
||
de: "Umsetzung in etwa {n} Werktagen ab Zahlungseingang",
|
||
"de-CH": "Umsetzung in etwa {n} Werktagen ab Zahlungseingang",
|
||
en: "Delivery in about {n} working days from receipt of payment",
|
||
fr: "Réalisation en environ {n} jours ouvrables après réception du paiement",
|
||
pt: "Execução em cerca de {n} dias úteis após a receção do pagamento" },
|
||
po_ag_gueltig: {
|
||
de: "Gültig bis {datum}",
|
||
"de-CH": "Gültig bis {datum}",
|
||
en: "Valid until {datum}", fr: "Valable jusqu’au {datum}", pt: "Válido até {datum}" },
|
||
po_ag_zusagen: {
|
||
de: "Angebot annehmen", "de-CH": "Angebot annehmen",
|
||
en: "Accept offer", fr: "Accepter le devis", pt: "Aceitar proposta" },
|
||
po_ag_ablehnen: {
|
||
de: "Doch nicht", "de-CH": "Doch nicht",
|
||
en: "Not right now", fr: "Pas pour l’instant", pt: "Agora não" },
|
||
po_ag_abgelaufen_text: {
|
||
de: "Dieses Angebot ist abgelaufen. Schreib mir kurz — ich mache dir gern ein neues.",
|
||
"de-CH": "Dieses Angebot ist abgelaufen. Schreib mir kurz — ich mache dir gern ein neues.",
|
||
en: "This offer has expired. Just message me and I will gladly make you a new one.",
|
||
fr: "Ce devis a expiré. Écrivez-moi, je vous en établirai volontiers un nouveau.",
|
||
pt: "Esta proposta expirou. Escreva-me e farei com gosto uma nova." },
|
||
po_ag_sicher: {
|
||
de: "Angebot verbindlich annehmen? Danach lege ich dein Projekt an und du bekommst die Anzahlung als Rechnung.",
|
||
"de-CH": "Angebot verbindlich annehmen? Danach lege ich dein Projekt an und du bekommst die Anzahlung als Rechnung.",
|
||
en: "Accept this offer bindingly? I will then set up your project and you will receive the deposit invoice.",
|
||
fr: "Accepter ce devis de manière ferme ? Je créerai ensuite votre projet et vous recevrez la facture d’acompte.",
|
||
pt: "Aceitar esta proposta de forma vinculativa? Depois crio o seu projeto e receberá a fatura do sinal." },
|
||
po_wartet_anzahlung_titel: {
|
||
de: "Startet, sobald deine Anzahlung da ist.",
|
||
"de-CH": "Startet, sobald deine Anzahlung da ist.",
|
||
en: "Starts as soon as your deposit arrives.",
|
||
fr: "Démarre dès réception de votre acompte.",
|
||
pt: "Começa assim que o seu sinal chegar." },
|
||
po_wartet_anzahlung_text: {
|
||
de: "Voraussichtlicher Liefertermin danach: ca. {datum}.",
|
||
"de-CH": "Voraussichtlicher Liefertermin danach: ca. {datum}.",
|
||
en: "Expected delivery date after that: approx. {datum}.",
|
||
fr: "Date de livraison prévue ensuite : env. {datum}.",
|
||
pt: "Data de entrega prevista depois disso: aprox. {datum}." },
|
||
po_liefertermin: { de: "Liefertermin", "de-CH": "Liefertermin", en: "Delivery date", fr: "Date de livraison", pt: "Data de entrega" },
|
||
po_noch_tage: { de: "noch {n} Werktage", "de-CH": "noch {n} Werktage", en: "{n} working days left", fr: "encore {n} jours ouvrables", pt: "faltam {n} dias úteis" },
|
||
po_noch_ein_tag: { de: "noch 1 Werktag", "de-CH": "noch 1 Werktag", en: "1 working day left", fr: "encore 1 jour ouvrable", pt: "falta 1 dia útil" },
|
||
po_heute_faellig: { de: "heute fällig", "de-CH": "heute fällig", en: "due today", fr: "échéance aujourd’hui", pt: "prazo hoje" },
|
||
po_ueberfaellig: { de: "überfällig", "de-CH": "überfällig", en: "overdue", fr: "en retard", pt: "em atraso" },
|
||
po_oeffnen: { de: "Öffnen", "de-CH": "Ufmache", en: "Open", fr: "Ouvrir", pt: "Abrir" },
|
||
po_zurueck: { de: "Zurück zur Übersicht", "de-CH": "Zrugg zur Übersicht", en: "Back to overview", fr: "Retour à l'aperçu", pt: "Voltar à visão geral" },
|
||
|
||
/* ---------- Projektdetail ---------- */
|
||
po_dateien: { de: "Dateien", "de-CH": "Datei", en: "Files", fr: "Fichiers", pt: "Ficheiros" },
|
||
po_keine_dateien: { de: "Noch keine Dateien.", "de-CH": "No kei Datei.", en: "No files yet.", fr: "Aucun fichier pour l'instant.", pt: "Ainda sem ficheiros." },
|
||
po_version: { de: "Fassung", "de-CH": "Fassig", en: "Version", fr: "Version", pt: "Versão" },
|
||
po_nachrichten: { de: "Nachrichten", "de-CH": "Nachrichte", en: "Messages", fr: "Messages", pt: "Mensagens" },
|
||
po_keine_nachrichten: { de: "Noch keine Nachrichten.", "de-CH": "No kei Nachrichte.", en: "No messages yet.", fr: "Aucun message pour l'instant.", pt: "Ainda sem mensagens." },
|
||
po_nachricht_platzhalter: {
|
||
de: "Frage oder Rückmeldung schreiben…",
|
||
"de-CH": "Frog oder Rückmäldig schriibe…",
|
||
en: "Write a question or some feedback…",
|
||
fr: "Écris une question ou un retour…",
|
||
pt: "Escreve uma pergunta ou um comentário…",
|
||
},
|
||
po_senden: { de: "Senden", "de-CH": "Schicke", en: "Send", fr: "Envoyer", pt: "Enviar" },
|
||
|
||
/* ---------- Änderungswünsche ---------- */
|
||
/* Hier steht ein ECHTES "&", kein "&" -- anders als in den meisten
|
||
anderen i18n-Dateien. Der Grund: Texte, die über data-i18n gesetzt
|
||
werden, landen als HTML in der Seite, dort ist "&" richtig.
|
||
Dieser Text wird aber im JavaScript durch die Absicherung geschickt
|
||
(s(...)), und die kodiert das "&" ein zweites Mal -- auf dem
|
||
Bildschirm stand "Ideen & Änderungswünsche". */
|
||
po_ideen: { de: "Ideen & Änderungswünsche", "de-CH": "Ideä & Änderigswünsch", en: "Ideas & change requests", fr: "Idées & demandes de modification", pt: "Ideias & pedidos de alteração" },
|
||
po_ideen_text: {
|
||
de: "Trag hier ein, was dir noch einfällt. Ich prüfe Aufwand und Preis und melde mich — du entscheidest danach in Ruhe.",
|
||
"de-CH": "Trag do ii, was dir no iifallt. Ich prüefe Ufwand und Priis und mälde mich — du entscheidsch dernoch i Rueh.",
|
||
en: "Note down whatever comes to mind. I review effort and price and get back to you — you then decide at your own pace.",
|
||
fr: "Note ici tout ce qui te vient. J'évalue l'effort et le prix et je reviens vers toi — tu décides ensuite tranquillement.",
|
||
pt: "Aponta aqui o que te ocorrer. Avalio esforço e preço e volto a contactar-te — depois decides com calma.",
|
||
},
|
||
po_idee_titel: { de: "Kurz gesagt", "de-CH": "Churz gseit", en: "In short", fr: "En bref", pt: "Em resumo" },
|
||
po_idee_text: { de: "Beschreibung", "de-CH": "Beschriibig", en: "Description", fr: "Description", pt: "Descrição" },
|
||
po_idee_senden: { de: "Idee einreichen", "de-CH": "Idee iireiche", en: "Submit idea", fr: "Envoyer l'idée", pt: "Enviar ideia" },
|
||
po_idee_leer: {
|
||
de: "Bitte gib der Idee einen Titel und beschreib sie kurz.",
|
||
"de-CH": "Bitte gib dr Idee en Titel und beschriib si churz.",
|
||
en: "Please give the idea a title and describe it briefly.",
|
||
fr: "Merci de donner un titre à l'idée et de la décrire brièvement.",
|
||
pt: "Dá um título à ideia e descreve-a brevemente.",
|
||
},
|
||
po_keine_ideen: { de: "Noch keine Ideen eingereicht.", "de-CH": "No kei Ideä iigreicht.", en: "No ideas submitted yet.", fr: "Aucune idée soumise pour l'instant.", pt: "Ainda sem ideias submetidas." },
|
||
|
||
po_ae_eingereicht: { de: "Eingereicht", "de-CH": "Iigreicht", en: "Submitted", fr: "Soumise", pt: "Submetida" },
|
||
po_ae_geprueft: { de: "Wird geprüft", "de-CH": "Wird prüeft", en: "Under review", fr: "En cours d'examen", pt: "Em análise" },
|
||
po_ae_angeboten: { de: "Angebot liegt vor", "de-CH": "Aagebot ligt vor", en: "Quote available", fr: "Devis disponible", pt: "Orçamento disponível" },
|
||
po_ae_angenommen: { de: "Angenommen", "de-CH": "Aagno", en: "Accepted", fr: "Acceptée", pt: "Aceite" },
|
||
po_ae_abgelehnt: { de: "Abgelehnt", "de-CH": "Abglehnt", en: "Declined", fr: "Refusée", pt: "Recusada" },
|
||
po_ae_umgesetzt: { de: "Umgesetzt", "de-CH": "Umgsetzt", en: "Implemented", fr: "Réalisée", pt: "Implementada" },
|
||
|
||
po_zusatzpreis: { de: "Zusätzlich", "de-CH": "Zuesätzlich", en: "Additional", fr: "En supplément", pt: "Adicional" },
|
||
po_zusatzdauer: { de: "Zusätzliche Dauer", "de-CH": "Zuesätzlichi Duur", en: "Additional time", fr: "Délai supplémentaire", pt: "Tempo adicional" },
|
||
po_annehmen: { de: "Annehmen", "de-CH": "Aanäh", en: "Accept", fr: "Accepter", pt: "Aceitar" },
|
||
po_ablehnen: { de: "Ablehnen", "de-CH": "Ablähne", en: "Decline", fr: "Refuser", pt: "Recusar" },
|
||
po_annehmen_frage: {
|
||
de: "Damit nimmst du das Zusatzangebot verbindlich an. Fortfahren?",
|
||
"de-CH": "Demit nimmsch s Zuesatzaagebot verbindlich aa. Wiitermache?",
|
||
en: "This accepts the additional quote as binding. Continue?",
|
||
fr: "Cela accepte le devis complémentaire de manière ferme. Continuer ?",
|
||
pt: "Isto aceita o orçamento adicional de forma vinculativa. Continuar?",
|
||
},
|
||
|
||
/* ---------- Zahlungen ---------- */
|
||
po_zahlungen: { de: "Zahlungen", "de-CH": "Zahlige", en: "Payments", fr: "Paiements", pt: "Pagamentos" },
|
||
po_za_offen: { de: "Offen", "de-CH": "Offe", en: "Open", fr: "En attente", pt: "Em aberto" },
|
||
po_za_freigegeben: { de: "In Bearbeitung", "de-CH": "I Bearbeitig", en: "Processing", fr: "En cours", pt: "Em processamento" },
|
||
po_za_bezahlt: { de: "Bezahlt", "de-CH": "Zahlt", en: "Paid", fr: "Payé", pt: "Pago" },
|
||
po_za_fehlge: { de: "Fehlgeschlagen", "de-CH": "Fählgschlage", en: "Failed", fr: "Échoué", pt: "Falhou" },
|
||
po_za_erstattet: { de: "Erstattet", "de-CH": "Erstattet", en: "Refunded", fr: "Remboursé", pt: "Reembolsado" },
|
||
po_keine_zahlungen: { de: "Keine Zahlungen vorgemerkt.", "de-CH": "Kei Zahlige vorgmerkt.", en: "No payments due.", fr: "Aucun paiement prévu.", pt: "Sem pagamentos previstos." },
|
||
|
||
/* ---------- Fehler ---------- */
|
||
po_fehler_login: {
|
||
de: "E-Mail oder Passwort stimmt nicht.",
|
||
"de-CH": "E-Mail oder Passwort stimmt nöd.",
|
||
en: "E-mail or password is incorrect.",
|
||
fr: "L'e-mail ou le mot de passe est incorrect.",
|
||
pt: "E-mail ou palavra-passe incorretos.",
|
||
},
|
||
po_abgelaufen: {
|
||
de: "Deine Sitzung ist abgelaufen. Bitte melde dich erneut an.",
|
||
"de-CH": "Dini Sitzig isch abgloffe. Bitte mäld dich nomol aa.",
|
||
en: "Your session has expired. Please sign in again.",
|
||
fr: "Ta session a expiré. Merci de te reconnecter.",
|
||
pt: "A tua sessão expirou. Inicia sessão novamente.",
|
||
},
|
||
|
||
/* ---------- Aufgabenliste (22.08.2026) ----------
|
||
"wenn sie drauf drücken sollen sie auch sehen was ich schon gemacht
|
||
habe von dem was im plan war."
|
||
|
||
Der Ton ist hier besonders wichtig. Der Kunde liest diese Liste,
|
||
wenn er unsicher ist, wie weit es steht — also im Zweifel schon
|
||
leicht angespannt. Sie muss beruhigen und klar sagen, was von IHM
|
||
erwartet wird, ohne zu drängen. "Wir warten auf dich" wäre Druck;
|
||
"Das brauche ich noch von dir" ist eine Bitte. */
|
||
po_aufgaben: {
|
||
de: "Was schon erledigt ist",
|
||
"de-CH": "Was scho erledigt isch",
|
||
en: "What's already done",
|
||
fr: "Ce qui est déjà fait",
|
||
pt: "O que já está feito",
|
||
},
|
||
po_aufg_text: {
|
||
de: "Jeder Punkt aus deinem Plan — abgehakt, sobald er fertig ist. Du siehst jederzeit, woran gerade gearbeitet wird und was noch von dir gebraucht wird.",
|
||
"de-CH": "Jede Punkt us dim Plan — abghakt, sobald er fertig isch. Du gsehsch jederziit, wo grad dra gschaffet wird und was no vo dir brucht wird.",
|
||
en: "Every point from your plan — ticked off as soon as it's finished. You can always see what's being worked on and what's still needed from you.",
|
||
fr: "Chaque point de ton plan — coché dès qu'il est terminé. Tu vois à tout moment ce sur quoi je travaille et ce qu'il me faut encore de ta part.",
|
||
pt: "Cada ponto do teu plano — assinalado assim que estiver pronto. Vês sempre no que se está a trabalhar e o que ainda é preciso da tua parte.",
|
||
},
|
||
po_aufg_leer: {
|
||
de: "Die Punkte erscheinen hier, sobald dein Plan steht.",
|
||
"de-CH": "D Pünkt erschiined do, sobald din Plan stoht.",
|
||
en: "The points appear here as soon as your plan is set.",
|
||
fr: "Les points apparaîtront ici dès que ton plan sera établi.",
|
||
pt: "Os pontos aparecem aqui assim que o teu plano estiver definido.",
|
||
},
|
||
po_aufg_fertig: {
|
||
de: "von {gesamt} erledigt",
|
||
"de-CH": "vo {gesamt} erledigt",
|
||
en: "of {gesamt} done",
|
||
fr: "sur {gesamt} terminés",
|
||
pt: "de {gesamt} concluídos",
|
||
},
|
||
po_aufg_dubist: {
|
||
de: "Das brauche ich noch von dir",
|
||
"de-CH": "Das bruuch ich no vo dir",
|
||
en: "This is what I still need from you",
|
||
fr: "Voici ce qu'il me faut encore de ta part",
|
||
pt: "Isto é o que ainda preciso da tua parte",
|
||
},
|
||
po_aufg_dubist_eins: {
|
||
de: "Ein Punkt wartet auf dich",
|
||
"de-CH": "Ei Punkt wartet uf dich",
|
||
en: "One point is waiting for you",
|
||
fr: "Un point t'attend",
|
||
pt: "Um ponto está à tua espera",
|
||
},
|
||
po_aufg_dubist_viele: {
|
||
de: "{n} Punkte warten auf dich",
|
||
"de-CH": "{n} Pünkt warted uf dich",
|
||
en: "{n} points are waiting for you",
|
||
fr: "{n} points t'attendent",
|
||
pt: "{n} pontos estão à tua espera",
|
||
},
|
||
po_aufg_allesbei: {
|
||
de: "Von dir wird gerade nichts gebraucht — lehn dich zurück.",
|
||
"de-CH": "Vo dir wird grad nüt brucht — lehn di zrugg.",
|
||
en: "Nothing is needed from you right now — sit back.",
|
||
fr: "Rien n'est attendu de toi pour l'instant — tu peux te détendre.",
|
||
pt: "Neste momento não é preciso nada da tua parte — descontrai.",
|
||
},
|
||
po_aufg_erledigt_marke: {
|
||
de: "erledigt",
|
||
"de-CH": "erledigt",
|
||
en: "done",
|
||
fr: "terminé",
|
||
pt: "concluído",
|
||
},
|
||
po_aufg_arbeit_marke: {
|
||
de: "läuft gerade",
|
||
"de-CH": "lauft grad",
|
||
en: "in progress",
|
||
fr: "en cours",
|
||
pt: "em curso",
|
||
},
|
||
po_aufg_du_marke: {
|
||
de: "bei dir",
|
||
"de-CH": "bi dir",
|
||
en: "your turn",
|
||
fr: "à toi",
|
||
pt: "contigo",
|
||
},
|
||
po_aufg_nicht: {
|
||
de: "nicht im Paket",
|
||
"de-CH": "nöd im Paket",
|
||
en: "not included",
|
||
fr: "hors forfait",
|
||
pt: "não incluído",
|
||
},
|
||
po_aufg_hake: {
|
||
de: "Erledigt — als erledigt melden",
|
||
"de-CH": "Erledigt — als erledigt mälde",
|
||
en: "Done — mark as done",
|
||
fr: "Fait — marquer comme terminé",
|
||
pt: "Feito — marcar como concluído",
|
||
},
|
||
po_aufg_zurueck: {
|
||
de: "Doch noch offen",
|
||
"de-CH": "Doch no offe",
|
||
en: "Still open after all",
|
||
fr: "Finalement pas terminé",
|
||
pt: "Afinal ainda em aberto",
|
||
},
|
||
|
||
/* ---------- Allgemeines Postfach (22.08.2026) ----------
|
||
"auf dieser seite sollen die kunden mir auch nachrichten hinterlassen
|
||
können, für noch kleinigkeiten oder sachen die ich brauch."
|
||
|
||
Bewusst niedrigschwellig formuliert. Wer glaubt, eine Nachricht
|
||
müsse eine "richtige" Anfrage sein, schreibt gar nicht erst — und
|
||
genau die kurzen Fragen sollen ja hier landen. */
|
||
po_postfach: {
|
||
de: "Kurz etwas fragen",
|
||
"de-CH": "Churz öppis frooge",
|
||
en: "Ask something quickly",
|
||
fr: "Une question rapide",
|
||
pt: "Perguntar algo rápido",
|
||
},
|
||
po_postfach_text: {
|
||
de: "Für alles Kleine zwischendurch — eine Frage, ein Hinweis, etwas Vergessenes. Auch wenn es zu keinem bestimmten Projekt gehört. Kein Anlass ist zu klein.",
|
||
"de-CH": "Für alles Chliine zwüschedure — e Frog, en Hiiwiis, öppis Vergässnigs. Au wenns zu kem bstimmte Projekt ghört. Kein Aalass isch z chlii.",
|
||
en: "For all the small things in between — a question, a note, something forgotten. Even if it doesn't belong to a particular project. No reason is too small.",
|
||
fr: "Pour tout ce qui est petit entre-temps — une question, une remarque, un oubli. Même si cela ne concerne aucun projet précis. Aucune raison n'est trop petite.",
|
||
pt: "Para todas as pequenas coisas pelo meio — uma pergunta, um aviso, algo esquecido. Mesmo que não pertença a um projeto específico. Nenhum motivo é pequeno demais.",
|
||
},
|
||
po_postfach_leer: {
|
||
de: "Noch nichts geschrieben. Schreib einfach los.",
|
||
"de-CH": "No nüt gschriebe. Schriib eifach los.",
|
||
en: "Nothing written yet. Just go ahead.",
|
||
fr: "Rien d'écrit pour l'instant. Lance-toi.",
|
||
pt: "Ainda nada escrito. Escreve à vontade.",
|
||
},
|
||
po_postfach_platzhalter: {
|
||
de: "Was möchtest du fragen oder mitteilen?",
|
||
"de-CH": "Was wotsch frooge oder mitteile?",
|
||
en: "What would you like to ask or tell me?",
|
||
fr: "Que veux-tu demander ou signaler ?",
|
||
pt: "O que queres perguntar ou dizer?",
|
||
},
|
||
po_postfach_bezug: {
|
||
de: "Worum geht es? (freiwillig)",
|
||
"de-CH": "Um was gohts? (freiwillig)",
|
||
en: "What is it about? (optional)",
|
||
fr: "De quoi s'agit-il ? (facultatif)",
|
||
pt: "Sobre o que é? (opcional)",
|
||
},
|
||
po_postfach_kein_bezug: {
|
||
de: "— nichts Bestimmtes —",
|
||
"de-CH": "— nüt Bstimmts —",
|
||
en: "— nothing in particular —",
|
||
fr: "— rien de particulier —",
|
||
pt: "— nada em particular —",
|
||
},
|
||
po_postfach_leer_fehler: {
|
||
de: "Bitte schreib zuerst etwas.",
|
||
"de-CH": "Bitte schriib zerscht öppis.",
|
||
en: "Please write something first.",
|
||
fr: "Merci d'écrire quelque chose d'abord.",
|
||
pt: "Escreve algo primeiro.",
|
||
},
|
||
po_postfach_gesendet: {
|
||
de: "Ist angekommen. Ich melde mich.",
|
||
"de-CH": "Isch aacho. Ich mälde mich.",
|
||
en: "Received. I'll get back to you.",
|
||
fr: "Bien reçu. Je reviens vers toi.",
|
||
pt: "Recebido. Volto a contactar-te.",
|
||
},
|
||
po_von_dogfather: {
|
||
de: "Dogfather",
|
||
"de-CH": "Dogfather",
|
||
en: "Dogfather",
|
||
fr: "Dogfather",
|
||
pt: "Dogfather",
|
||
},
|
||
};
|