L15 Testphase & Onboarding: Selbstanmeldung mit Double-Opt-in, Plattform-Wizard, Nur-Lesen-Sperre, Export, Lebenszyklus-Job
- Datenmodell: Testphasen-Lebenszyklus am Mandanten (plan, trialEndsAt, readOnlySince, deletionDueAt, Versandmarker), TrialSignup (Plattform, Hashes statt Klartext), TenantExport (RLS), Onboarding-Status - /testen: 5-Schritte-Wizard (Betrieb, Admin-Konto, Enddatum, Einrichtung, Zusammenfassung), Bestätigung per POST, direkte Anmeldung über login-ticket; Rate-Limit je IP/E-Mail, Honeypot, Enumeration-Schutz, Slug-Kollisionen - Plattform: Wizard „Testmandant anlegen“ mit Einladung, Badges/Filter, Enddatum ändern, umwandeln, beenden, Löschung vormerken/abbrechen (Bestätigung + Audit) - Schreibsperre nach Ablauf zentral in moduleGuard und requireApiContext (non-GET über withApi), Upload-Routen, Einstellungen/Nutzerverwaltung, Worker-Jobs; Banner Backoffice + mobil - Datenexport (ZIP mit CSV/JSON + Dateien) als Worker-Job, auch im Nur-Lesen-Zustand - Täglicher Job trial-lifecycle: Erinnerungen 7/3/1, Ablauf, Löschhinweis, Löschung über das Offboarding - Erste-Schritte-Checkliste im Dashboard, Mail-Vorlagen de/en, Tests + Smoke, Betriebsdoku Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -21,5 +21,6 @@
|
||||
"openMenu": "Menü öffnen",
|
||||
"closeMenu": "Menü schließen",
|
||||
"timeApprovals": "Zeiten zur Freigabe",
|
||||
"billing": "Abrechnung"
|
||||
"billing": "Abrechnung",
|
||||
"dataExport": "Datenexport"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,269 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Kostenlos testen",
|
||||
"confirmTitle": "Testphase bestätigen",
|
||||
"termsTitle": "Nutzungsbedingungen",
|
||||
"privacyTitle": "Datenschutz"
|
||||
},
|
||||
"public": {
|
||||
"heading": "Craftvia kostenlos testen",
|
||||
"intro": "In wenigen Minuten eingerichtet. Ohne Zahlungsdaten, ohne automatische Verlängerung.",
|
||||
"benefit1": "Aufträge planen, Einsätze mobil erfassen, Berichte mit Unterschrift",
|
||||
"benefit2": "Enddatum frei wählen – danach bleiben Ihre Daten lesbar und exportierbar",
|
||||
"benefit3": "Auf Wunsch mit Beispieldaten zum sofortigen Ausprobieren",
|
||||
"haveAccount": "Schon einen Zugang?",
|
||||
"login": "Anmelden",
|
||||
"terms": "Nutzungsbedingungen",
|
||||
"privacy": "Datenschutz"
|
||||
},
|
||||
"steps": {
|
||||
"company": "Betrieb",
|
||||
"account": "Admin-Konto",
|
||||
"period": "Testzeitraum",
|
||||
"setup": "Einrichtung",
|
||||
"summary": "Zusammenfassung"
|
||||
},
|
||||
"progress": "Schritt {current} von {total}",
|
||||
"progressLabel": "Fortschritt",
|
||||
"fields": {
|
||||
"companyName": "Firmenname",
|
||||
"sector": "Branche",
|
||||
"sectorChoose": "Bitte wählen (optional)",
|
||||
"sectorOther": "Branche (Freitext)",
|
||||
"companySize": "Betriebsgröße",
|
||||
"companySizeNone": "Keine Angabe",
|
||||
"adminName": "Ihr Name",
|
||||
"email": "E-Mail-Adresse",
|
||||
"emailHint": "Die Adresse ist Ihr Anmeldename. Wir senden Ihnen einen Bestätigungslink.",
|
||||
"password": "Passwort",
|
||||
"passwordHint": "Anforderungen: {policy}",
|
||||
"showPassword": "Passwort anzeigen",
|
||||
"trialEndDate": "Testphase bis",
|
||||
"sampleData": "Mit Beispieldaten starten",
|
||||
"sampleDataHint": "Drei Kunden, Objekte, ein Team und vier Aufträge in verschiedenen Zuständen. Sie können sie jederzeit löschen.",
|
||||
"modules": "Module",
|
||||
"modulesHint": "Alle Module sind vorausgewählt. Nicht benötigte Module können Sie abwählen – später lässt sich das ändern.",
|
||||
"acceptTerms": "Ich akzeptiere die {link}.",
|
||||
"acceptPrivacy": "Ich habe die {link} gelesen.",
|
||||
"required": "Pflichtfeld",
|
||||
"website": "Website (bitte leer lassen)"
|
||||
},
|
||||
"sectors": {
|
||||
"shk": "Sanitär, Heizung, Klima",
|
||||
"electrical": "Elektro",
|
||||
"roofing": "Dach und Fassade",
|
||||
"carpentry": "Tischlerei und Innenausbau",
|
||||
"painting": "Maler und Lackierer",
|
||||
"facility": "Gebäudetechnik und Facility",
|
||||
"construction": "Bau und Montage",
|
||||
"metal": "Metallbau",
|
||||
"other": "Andere Branche"
|
||||
},
|
||||
"sizes": {
|
||||
"1_5": "1–5 Beschäftigte",
|
||||
"6_20": "6–20 Beschäftigte",
|
||||
"21_50": "21–50 Beschäftigte",
|
||||
"51_200": "51–200 Beschäftigte",
|
||||
"200_": "mehr als 200 Beschäftigte"
|
||||
},
|
||||
"period": {
|
||||
"until": "Testphase bis {date} ({days, plural, one {# Tag} other {# Tage}})",
|
||||
"range": "Möglich: {min} bis {max}",
|
||||
"afterEnd": "Nach dem Enddatum bleiben Ihre Daten lesbar und exportierbar. Ohne Umwandlung in die Vollversion löschen wir sie 30 Tage später."
|
||||
},
|
||||
"summary": {
|
||||
"intro": "Bitte prüfen Sie Ihre Angaben.",
|
||||
"sampleYes": "mit Beispieldaten",
|
||||
"sampleNo": "ohne Beispieldaten",
|
||||
"modulesCount": "{count} von {total} Modulen",
|
||||
"edit": "Ändern",
|
||||
"noSector": "keine Branche angegeben"
|
||||
},
|
||||
"actions": {
|
||||
"back": "Zurück",
|
||||
"next": "Weiter",
|
||||
"submit": "Testphase starten",
|
||||
"submitting": "Wird gesendet …",
|
||||
"checking": "Wird geprüft …"
|
||||
},
|
||||
"sent": {
|
||||
"title": "Fast geschafft – bitte E-Mail bestätigen",
|
||||
"body": "Wir haben Ihnen eine E-Mail geschickt. Klicken Sie auf den Link darin, um Ihre Testphase zu starten.",
|
||||
"hint": "Der Link ist 24 Stunden gültig. Keine E-Mail erhalten? Prüfen Sie den Spam-Ordner oder starten Sie die Anmeldung erneut.",
|
||||
"again": "Anmeldung neu starten"
|
||||
},
|
||||
"errors": {
|
||||
"company_required": "Bitte den Firmennamen angeben (mindestens 2 Zeichen).",
|
||||
"too_long": "Die Eingabe ist zu lang.",
|
||||
"invalid_choice": "Bitte einen Eintrag aus der Liste wählen.",
|
||||
"name_required": "Bitte Ihren Namen angeben.",
|
||||
"email_invalid": "Bitte eine gültige E-Mail-Adresse angeben.",
|
||||
"password_policy": "Das Passwort erfüllt die Anforderungen nicht.",
|
||||
"date_invalid": "Bitte ein gültiges Datum wählen.",
|
||||
"date_too_early": "Das Enddatum muss frühestens morgen sein.",
|
||||
"date_too_late": "Das Enddatum liegt zu weit in der Zukunft.",
|
||||
"modules_required": "Bitte mindestens ein Modul auswählen.",
|
||||
"terms_required": "Bitte die Nutzungsbedingungen akzeptieren.",
|
||||
"privacy_required": "Bitte die Datenschutzhinweise bestätigen.",
|
||||
"invalid_request": "Die Anfrage war unvollständig. Bitte Seite neu laden.",
|
||||
"rate_limited": "Zu viele Versuche. Bitte in einigen Minuten erneut versuchen.",
|
||||
"failed": "Das hat nicht geklappt. Bitte erneut versuchen."
|
||||
},
|
||||
"confirm": {
|
||||
"title": "Testphase starten",
|
||||
"intro": "Bestätigen Sie Ihre Anmeldung. Danach richten wir Ihren Zugang ein und melden Sie direkt an.",
|
||||
"company": "Betrieb",
|
||||
"until": "Testphase bis",
|
||||
"sampleData": "Beispieldaten",
|
||||
"yes": "ja",
|
||||
"no": "nein",
|
||||
"button": "Jetzt einrichten",
|
||||
"pending": "Wird eingerichtet …",
|
||||
"invalid": "Der Link ist ungültig oder wurde bereits verwendet.",
|
||||
"expired": "Der Link ist abgelaufen. Bitte starten Sie die Anmeldung erneut.",
|
||||
"rate_limited": "Zu viele Versuche. Bitte in einigen Minuten erneut versuchen.",
|
||||
"toSignup": "Zur Anmeldung „Kostenlos testen“",
|
||||
"toLogin": "Zum Login"
|
||||
},
|
||||
"legal": {
|
||||
"back": "Zurück zur Anmeldung",
|
||||
"placeholder": "Platzhalter – der verbindliche Text wird vom Betreiber vor dem Go-live eingesetzt.",
|
||||
"termsBody1": "Die Testphase ist kostenlos und endet automatisch zum gewählten Datum. Es entsteht kein Vertrag über eine kostenpflichtige Nutzung.",
|
||||
"termsBody2": "Nach dem Ende sind die Daten 30 Tage lesbar und exportierbar. Ohne Umwandlung in die Vollversion werden sie danach gelöscht.",
|
||||
"privacyBody1": "Wir verarbeiten Ihre Angaben (Firmenname, Name, E-Mail-Adresse) zur Einrichtung und Betreuung der Testphase. Passwörter speichern wir ausschließlich als sicheren Hash.",
|
||||
"privacyBody2": "Nicht bestätigte Anmeldungen löschen wir nach wenigen Tagen. Daten der Testphase werden nach Ablauf gemäß den Nutzungsbedingungen gelöscht."
|
||||
},
|
||||
"banner": {
|
||||
"endsIn": "{days, plural, =0 {Testphase endet heute.} =1 {Testphase endet morgen.} other {Testphase endet in # Tagen.}}",
|
||||
"endsOn": "Letzter Tag: {date}.",
|
||||
"expired": "Testphase abgelaufen – nur Lesezugriff.",
|
||||
"deletion": "Daten werden am {date} gelöscht.",
|
||||
"contact": "Vollversion oder Verlängerung: {email}",
|
||||
"contactGeneric": "Vollversion oder Verlängerung? Wenden Sie sich an Ihren Ansprechpartner bei Craftvia.",
|
||||
"export": "Daten exportieren"
|
||||
},
|
||||
"onboarding": {
|
||||
"title": "Erste Schritte",
|
||||
"welcome": "Willkommen! Ihre Testphase ist eingerichtet.",
|
||||
"progress": "{done} von {total} erledigt",
|
||||
"hide": "Ausblenden",
|
||||
"markDone": "Als erledigt markieren",
|
||||
"markOpen": "Wieder öffnen",
|
||||
"open": "Öffnen",
|
||||
"auto": "erkannt",
|
||||
"doneLabel": "Erledigt",
|
||||
"openLabel": "Offen",
|
||||
"items": {
|
||||
"company": { "title": "Firmendaten prüfen", "text": "Adresse, Telefon und E-Mail erscheinen auf Berichten." },
|
||||
"team": { "title": "Team anlegen", "text": "Teams bündeln Monteure für Planung und Zuweisung." },
|
||||
"technician": { "title": "Monteur einladen", "text": "Ein Einladungslink genügt – das Passwort vergibt die Person selbst." },
|
||||
"first_order": { "title": "Ersten Auftrag anlegen oder importieren", "text": "Manuell erfassen oder ein Auftrags-PDF hochladen." },
|
||||
"mobile": { "title": "Mobile App öffnen", "text": "Auf dem Smartphone /m aufrufen und zum Startbildschirm hinzufügen." }
|
||||
}
|
||||
},
|
||||
"export": {
|
||||
"crumb": "Organisation",
|
||||
"title": "Datenexport",
|
||||
"sub": "Alle Daten Ihres Betriebs als ZIP-Datei",
|
||||
"contents": "Enthalten: Kunden, Ansprechpartner, Objekte, Teams, Aufträge, Zeiten, Material, Berichte, Meilensteine und Abrechnung als CSV und JSON sowie alle gespeicherten Dateien (Dokumente, Berichts-PDFs, Fotos).",
|
||||
"readOnlyHint": "Der Export ist auch nach Ablauf der Testphase möglich.",
|
||||
"request": "Export erstellen",
|
||||
"requested": "Export angefordert. Die Datei steht in wenigen Minuten bereit – laden Sie die Seite dann neu.",
|
||||
"listTitle": "Letzte Exporte",
|
||||
"empty": "Noch kein Export erstellt.",
|
||||
"created": "Angefordert",
|
||||
"state": "Status",
|
||||
"file": "Datei",
|
||||
"status": { "queued": "Wartet", "running": "Wird erstellt", "done": "Bereit", "failed": "Fehlgeschlagen", "expired": "Abgelaufen" },
|
||||
"download": "Herunterladen",
|
||||
"expires": "bis {date}",
|
||||
"errors": {
|
||||
"export_running": "Es läuft bereits ein Export. Bitte warten Sie, bis er fertig ist.",
|
||||
"failed": "Der Export konnte nicht angefordert werden."
|
||||
}
|
||||
},
|
||||
"platform": {
|
||||
"newTrial": "Testmandant anlegen",
|
||||
"filter": "Filter",
|
||||
"filterAll": "Alle",
|
||||
"filterTrial": "Test",
|
||||
"filterFull": "Voll",
|
||||
"colPlan": "Version",
|
||||
"badgeFull": "Vollversion",
|
||||
"badgeUntil": "Test bis {date}",
|
||||
"badgeExpired": "abgelaufen – nur lesen",
|
||||
"badgeDeletion": "Löschung am {date}",
|
||||
"badgeDeleted": "gelöscht",
|
||||
"wizard": {
|
||||
"crumb": "Plattform-Betrieb",
|
||||
"title": "Testmandant anlegen",
|
||||
"sub": "Mandant mit Enddatum anlegen; der Admin erhält eine Einladung zum Passwort-Setzen.",
|
||||
"sectionCompany": "1. Betrieb",
|
||||
"sectionAdmin": "2. Administrator",
|
||||
"sectionPeriod": "3. Testzeitraum",
|
||||
"sectionSetup": "4. Einrichtung",
|
||||
"companyName": "Firmenname",
|
||||
"sector": "Branche (optional)",
|
||||
"adminName": "Name",
|
||||
"adminEmail": "E-Mail-Adresse",
|
||||
"adminHint": "Neue Adressen erhalten den bestehenden Einladungslink (7 Tage gültig). Bestehende Zugänge werden nur verknüpft.",
|
||||
"endDate": "Testphase bis",
|
||||
"endDateHint": "Frei wählbar bis ein Jahr im Voraus.",
|
||||
"sampleData": "Mit Beispieldaten",
|
||||
"submit": "Testmandant anlegen",
|
||||
"submitting": "Wird angelegt …",
|
||||
"cancel": "Abbrechen"
|
||||
},
|
||||
"card": {
|
||||
"title": "Testphase",
|
||||
"plan": "Version",
|
||||
"until": "Letzter Tag",
|
||||
"state": "Zustand",
|
||||
"stateActive": "läuft",
|
||||
"stateExpired": "abgelaufen – nur lesen",
|
||||
"stateConverted": "in Vollversion umgewandelt",
|
||||
"stateDeleted": "gelöscht",
|
||||
"deletion": "Löschung",
|
||||
"deletionNone": "nicht vorgemerkt",
|
||||
"source": "Herkunft",
|
||||
"sourceSelf": "Selbstanmeldung",
|
||||
"sourcePlatform": "Plattform-Wizard",
|
||||
"extend": "Enddatum ändern / verlängern",
|
||||
"convert": "In Vollversion umwandeln",
|
||||
"end": "Testphase sofort beenden",
|
||||
"schedule": "Löschung vormerken",
|
||||
"cancel": "Löschung abbrechen",
|
||||
"created": "Testmandant angelegt.",
|
||||
"invited": "Die Einladung an den Administrator wurde verschickt.",
|
||||
"done": "Änderung gespeichert."
|
||||
},
|
||||
"ops": {
|
||||
"extendTitle": "Enddatum ändern",
|
||||
"extendText": "Neues letztes Testdatum. Liegt es in der Zukunft, ist der Mandant sofort wieder schreibbar; Erinnerungen werden neu geplant.",
|
||||
"convertTitle": "In Vollversion umwandeln",
|
||||
"convertText": "Der Mandant bleibt dauerhaft schreibbar und wird nie automatisch gelöscht.",
|
||||
"endTitle": "Testphase sofort beenden",
|
||||
"endText": "Der Mandant ist ab sofort nur noch lesbar. Eine vorgemerkte Löschung verschiebt sich auf 30 Tage ab heute.",
|
||||
"scheduleTitle": "Löschung vormerken",
|
||||
"scheduleText": "Löschung 30 Tage nach Ende, frühestens in 7 Tagen (Hinweismail an die Admins).",
|
||||
"cancelTitle": "Löschung abbrechen",
|
||||
"cancelText": "Der Mandant wird nicht automatisch gelöscht. Er bleibt nach Ablauf nur lesbar.",
|
||||
"confirm": "Ich bestätige diese Änderung.",
|
||||
"submit": "Ausführen",
|
||||
"submitting": "Wird ausgeführt …",
|
||||
"close": "Schließen"
|
||||
},
|
||||
"errors": {
|
||||
"confirm_required": "Bitte die Bestätigung ankreuzen.",
|
||||
"invalid_input": "Bitte die Eingaben prüfen.",
|
||||
"date_invalid": "Bitte ein gültiges Datum wählen.",
|
||||
"date_in_past": "Das Enddatum darf nicht in der Vergangenheit liegen.",
|
||||
"date_too_late": "Das Enddatum liegt mehr als ein Jahr in der Zukunft.",
|
||||
"not_a_trial": "Dieser Mandant ist keine Testversion.",
|
||||
"tenant_deleted": "Der Mandant wurde bereits gelöscht.",
|
||||
"platform_admin_required": "Nur Plattform-Voll-Administratoren dürfen das.",
|
||||
"tenant not found": "Mandant nicht gefunden.",
|
||||
"failed": "Die Aktion ist fehlgeschlagen."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -21,5 +21,6 @@
|
||||
"openMenu": "Open menu",
|
||||
"closeMenu": "Close menu",
|
||||
"timeApprovals": "Time approvals",
|
||||
"billing": "Billing"
|
||||
"billing": "Billing",
|
||||
"dataExport": "Data export"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,269 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Try for free",
|
||||
"confirmTitle": "Confirm trial",
|
||||
"termsTitle": "Terms of use",
|
||||
"privacyTitle": "Privacy"
|
||||
},
|
||||
"public": {
|
||||
"heading": "Try Craftvia for free",
|
||||
"intro": "Set up in minutes. No payment details, no automatic renewal.",
|
||||
"benefit1": "Plan work orders, record jobs on mobile, reports with signature",
|
||||
"benefit2": "Choose the end date – afterwards your data stays readable and exportable",
|
||||
"benefit3": "Optional sample data to try everything right away",
|
||||
"haveAccount": "Already have an account?",
|
||||
"login": "Sign in",
|
||||
"terms": "Terms of use",
|
||||
"privacy": "Privacy"
|
||||
},
|
||||
"steps": {
|
||||
"company": "Company",
|
||||
"account": "Admin account",
|
||||
"period": "Trial period",
|
||||
"setup": "Setup",
|
||||
"summary": "Summary"
|
||||
},
|
||||
"progress": "Step {current} of {total}",
|
||||
"progressLabel": "Progress",
|
||||
"fields": {
|
||||
"companyName": "Company name",
|
||||
"sector": "Trade",
|
||||
"sectorChoose": "Please choose (optional)",
|
||||
"sectorOther": "Trade (free text)",
|
||||
"companySize": "Company size",
|
||||
"companySizeNone": "Not specified",
|
||||
"adminName": "Your name",
|
||||
"email": "E-mail address",
|
||||
"emailHint": "The address is your sign-in name. We will send you a confirmation link.",
|
||||
"password": "Password",
|
||||
"passwordHint": "Requirements: {policy}",
|
||||
"showPassword": "Show password",
|
||||
"trialEndDate": "Trial until",
|
||||
"sampleData": "Start with sample data",
|
||||
"sampleDataHint": "Three customers, sites, one team and four work orders in different states. You can delete them at any time.",
|
||||
"modules": "Modules",
|
||||
"modulesHint": "All modules are preselected. Deselect modules you do not need – you can change this later.",
|
||||
"acceptTerms": "I accept the {link}.",
|
||||
"acceptPrivacy": "I have read the {link}.",
|
||||
"required": "Required",
|
||||
"website": "Website (leave empty)"
|
||||
},
|
||||
"sectors": {
|
||||
"shk": "Plumbing, heating, air conditioning",
|
||||
"electrical": "Electrical",
|
||||
"roofing": "Roofing and facades",
|
||||
"carpentry": "Carpentry and interior fit-out",
|
||||
"painting": "Painting and decorating",
|
||||
"facility": "Building services and facility",
|
||||
"construction": "Construction and installation",
|
||||
"metal": "Metalwork",
|
||||
"other": "Other trade"
|
||||
},
|
||||
"sizes": {
|
||||
"1_5": "1–5 employees",
|
||||
"6_20": "6–20 employees",
|
||||
"21_50": "21–50 employees",
|
||||
"51_200": "51–200 employees",
|
||||
"200_": "more than 200 employees"
|
||||
},
|
||||
"period": {
|
||||
"until": "Trial until {date} ({days, plural, one {# day} other {# days}})",
|
||||
"range": "Possible: {min} to {max}",
|
||||
"afterEnd": "After the end date your data stays readable and exportable. Unless converted to the full version, we delete it 30 days later."
|
||||
},
|
||||
"summary": {
|
||||
"intro": "Please check your details.",
|
||||
"sampleYes": "with sample data",
|
||||
"sampleNo": "without sample data",
|
||||
"modulesCount": "{count} of {total} modules",
|
||||
"edit": "Edit",
|
||||
"noSector": "no trade specified"
|
||||
},
|
||||
"actions": {
|
||||
"back": "Back",
|
||||
"next": "Next",
|
||||
"submit": "Start trial",
|
||||
"submitting": "Sending …",
|
||||
"checking": "Checking …"
|
||||
},
|
||||
"sent": {
|
||||
"title": "Almost done – please confirm your e-mail",
|
||||
"body": "We have sent you an e-mail. Click the link in it to start your trial.",
|
||||
"hint": "The link is valid for 24 hours. No e-mail? Check your spam folder or start the signup again.",
|
||||
"again": "Start signup again"
|
||||
},
|
||||
"errors": {
|
||||
"company_required": "Please enter the company name (at least 2 characters).",
|
||||
"too_long": "The input is too long.",
|
||||
"invalid_choice": "Please choose an entry from the list.",
|
||||
"name_required": "Please enter your name.",
|
||||
"email_invalid": "Please enter a valid e-mail address.",
|
||||
"password_policy": "The password does not meet the requirements.",
|
||||
"date_invalid": "Please choose a valid date.",
|
||||
"date_too_early": "The end date must be tomorrow at the earliest.",
|
||||
"date_too_late": "The end date is too far in the future.",
|
||||
"modules_required": "Please select at least one module.",
|
||||
"terms_required": "Please accept the terms of use.",
|
||||
"privacy_required": "Please confirm the privacy notice.",
|
||||
"invalid_request": "The request was incomplete. Please reload the page.",
|
||||
"rate_limited": "Too many attempts. Please try again in a few minutes.",
|
||||
"failed": "That did not work. Please try again."
|
||||
},
|
||||
"confirm": {
|
||||
"title": "Start trial",
|
||||
"intro": "Confirm your signup. We then set up your account and sign you in right away.",
|
||||
"company": "Company",
|
||||
"until": "Trial until",
|
||||
"sampleData": "Sample data",
|
||||
"yes": "yes",
|
||||
"no": "no",
|
||||
"button": "Set up now",
|
||||
"pending": "Setting up …",
|
||||
"invalid": "The link is invalid or has already been used.",
|
||||
"expired": "The link has expired. Please start the signup again.",
|
||||
"rate_limited": "Too many attempts. Please try again in a few minutes.",
|
||||
"toSignup": "Go to “Try for free”",
|
||||
"toLogin": "Go to sign-in"
|
||||
},
|
||||
"legal": {
|
||||
"back": "Back to signup",
|
||||
"placeholder": "Placeholder – the binding text will be provided by the operator before go-live.",
|
||||
"termsBody1": "The trial is free of charge and ends automatically on the chosen date. No contract for paid use is concluded.",
|
||||
"termsBody2": "After the end the data stays readable and exportable for 30 days. Unless converted to the full version, it is deleted afterwards.",
|
||||
"privacyBody1": "We process your details (company name, name, e-mail address) to set up and support the trial. Passwords are stored as a secure hash only.",
|
||||
"privacyBody2": "Unconfirmed signups are deleted after a few days. Trial data is deleted after expiry as described in the terms of use."
|
||||
},
|
||||
"banner": {
|
||||
"endsIn": "{days, plural, =0 {Trial ends today.} =1 {Trial ends tomorrow.} other {Trial ends in # days.}}",
|
||||
"endsOn": "Last day: {date}.",
|
||||
"expired": "Trial expired – read-only access.",
|
||||
"deletion": "Data will be deleted on {date}.",
|
||||
"contact": "Full version or extension: {email}",
|
||||
"contactGeneric": "Full version or extension? Contact your Craftvia representative.",
|
||||
"export": "Export data"
|
||||
},
|
||||
"onboarding": {
|
||||
"title": "Getting started",
|
||||
"welcome": "Welcome! Your trial is ready.",
|
||||
"progress": "{done} of {total} done",
|
||||
"hide": "Hide",
|
||||
"markDone": "Mark as done",
|
||||
"markOpen": "Reopen",
|
||||
"open": "Open",
|
||||
"auto": "detected",
|
||||
"doneLabel": "Done",
|
||||
"openLabel": "Open",
|
||||
"items": {
|
||||
"company": { "title": "Check company details", "text": "Address, phone and e-mail appear on reports." },
|
||||
"team": { "title": "Create a team", "text": "Teams group technicians for planning and assignment." },
|
||||
"technician": { "title": "Invite a technician", "text": "An invitation link is enough – the person sets their own password." },
|
||||
"first_order": { "title": "Create or import the first work order", "text": "Enter it manually or upload a work order PDF." },
|
||||
"mobile": { "title": "Open the mobile app", "text": "Open /m on your smartphone and add it to the home screen." }
|
||||
}
|
||||
},
|
||||
"export": {
|
||||
"crumb": "Organisation",
|
||||
"title": "Data export",
|
||||
"sub": "All data of your company as a ZIP file",
|
||||
"contents": "Included: customers, contacts, sites, teams, work orders, times, material, reports, milestones and billing as CSV and JSON plus all stored files (documents, report PDFs, photos).",
|
||||
"readOnlyHint": "The export stays available after the trial has expired.",
|
||||
"request": "Create export",
|
||||
"requested": "Export requested. The file is ready in a few minutes – reload the page then.",
|
||||
"listTitle": "Recent exports",
|
||||
"empty": "No export created yet.",
|
||||
"created": "Requested",
|
||||
"state": "Status",
|
||||
"file": "File",
|
||||
"status": { "queued": "Waiting", "running": "In progress", "done": "Ready", "failed": "Failed", "expired": "Expired" },
|
||||
"download": "Download",
|
||||
"expires": "until {date}",
|
||||
"errors": {
|
||||
"export_running": "An export is already running. Please wait until it has finished.",
|
||||
"failed": "The export could not be requested."
|
||||
}
|
||||
},
|
||||
"platform": {
|
||||
"newTrial": "Create trial tenant",
|
||||
"filter": "Filter",
|
||||
"filterAll": "All",
|
||||
"filterTrial": "Trial",
|
||||
"filterFull": "Full",
|
||||
"colPlan": "Version",
|
||||
"badgeFull": "Full version",
|
||||
"badgeUntil": "Trial until {date}",
|
||||
"badgeExpired": "expired – read-only",
|
||||
"badgeDeletion": "Deletion on {date}",
|
||||
"badgeDeleted": "deleted",
|
||||
"wizard": {
|
||||
"crumb": "Platform operations",
|
||||
"title": "Create trial tenant",
|
||||
"sub": "Create a tenant with an end date; the admin receives an invitation to set a password.",
|
||||
"sectionCompany": "1. Company",
|
||||
"sectionAdmin": "2. Administrator",
|
||||
"sectionPeriod": "3. Trial period",
|
||||
"sectionSetup": "4. Setup",
|
||||
"companyName": "Company name",
|
||||
"sector": "Trade (optional)",
|
||||
"adminName": "Name",
|
||||
"adminEmail": "E-mail address",
|
||||
"adminHint": "New addresses receive the existing invitation link (valid for 7 days). Existing accounts are only linked.",
|
||||
"endDate": "Trial until",
|
||||
"endDateHint": "Any date up to one year ahead.",
|
||||
"sampleData": "With sample data",
|
||||
"submit": "Create trial tenant",
|
||||
"submitting": "Creating …",
|
||||
"cancel": "Cancel"
|
||||
},
|
||||
"card": {
|
||||
"title": "Trial",
|
||||
"plan": "Version",
|
||||
"until": "Last day",
|
||||
"state": "State",
|
||||
"stateActive": "running",
|
||||
"stateExpired": "expired – read-only",
|
||||
"stateConverted": "converted to full version",
|
||||
"stateDeleted": "deleted",
|
||||
"deletion": "Deletion",
|
||||
"deletionNone": "not scheduled",
|
||||
"source": "Origin",
|
||||
"sourceSelf": "Self-service signup",
|
||||
"sourcePlatform": "Platform wizard",
|
||||
"extend": "Change / extend end date",
|
||||
"convert": "Convert to full version",
|
||||
"end": "End trial now",
|
||||
"schedule": "Schedule deletion",
|
||||
"cancel": "Cancel deletion",
|
||||
"created": "Trial tenant created.",
|
||||
"invited": "The invitation was sent to the administrator.",
|
||||
"done": "Change saved."
|
||||
},
|
||||
"ops": {
|
||||
"extendTitle": "Change end date",
|
||||
"extendText": "New last trial day. If it lies in the future, the tenant is writable again immediately; reminders are rescheduled.",
|
||||
"convertTitle": "Convert to full version",
|
||||
"convertText": "The tenant stays writable permanently and is never deleted automatically.",
|
||||
"endTitle": "End trial now",
|
||||
"endText": "The tenant is read-only from now on. A scheduled deletion moves to 30 days from today.",
|
||||
"scheduleTitle": "Schedule deletion",
|
||||
"scheduleText": "Deletion 30 days after the end, at the earliest in 7 days (notice mail to the admins).",
|
||||
"cancelTitle": "Cancel deletion",
|
||||
"cancelText": "The tenant will not be deleted automatically. It stays read-only after expiry.",
|
||||
"confirm": "I confirm this change.",
|
||||
"submit": "Execute",
|
||||
"submitting": "Executing …",
|
||||
"close": "Close"
|
||||
},
|
||||
"errors": {
|
||||
"confirm_required": "Please tick the confirmation.",
|
||||
"invalid_input": "Please check your input.",
|
||||
"date_invalid": "Please choose a valid date.",
|
||||
"date_in_past": "The end date must not lie in the past.",
|
||||
"date_too_late": "The end date is more than one year ahead.",
|
||||
"not_a_trial": "This tenant is not a trial.",
|
||||
"tenant_deleted": "The tenant has already been deleted.",
|
||||
"platform_admin_required": "Only platform full administrators may do this.",
|
||||
"tenant not found": "Tenant not found.",
|
||||
"failed": "The action failed."
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user