Files
mintel.me/apps/web/src/content/de.ts
T
mmintelandClaude Opus 5.5 c7f8672cd0 feat: estimates on the homepage, monthly booking on the freelance page
The homepage showed a price list per case, including a day rate. Buyers of
a result need a way to a price, not rates: each case now shows three steps
to an estimate, one line for orientation and a button that opens the
contact message with that topic chosen.

The developer case is booked by the month, not by the day. The day rate is
gone; the freelance page has the booking terms: 100 EUR per hour, fixed
days of the week agreed for one month at a time, an example month, monthly
invoice, two weeks notice to the end of a month.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 10:01:23 +02:00

818 lines
32 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { Content } from "./types";
const SIGN_OFF = "Viele Grüße";
const GREETING = "Hallo Herr Mintel,";
const FIRST_CALL = "Ein erstes Gespräch, etwa 20 Minuten";
const GET_IN_TOUCH = "Kontakt aufnehmen";
/** The German texts of the site, in the formal "Sie". en.ts holds the same in English. */
export const de: Content = {
site: {
title: "Freelance-Webentwickler für Web-Apps & Websites | Marc Mintel",
description:
"Freelance-Webentwickler mit 15 Jahren Erfahrung. Ich baue Web-Apps, Interfaces und Websites mit React, Next.js und TypeScript und automatisiere Abläufe.",
jobTitle: "Freelance-Webentwickler",
ogLocale: "de_DE",
shareImageAlt:
"Web-Apps und Websites. Marc Mintel, Freelance-Webentwickler mit 15 Jahren Erfahrung.",
knowsAbout: [
"Webanwendungen",
"User Interfaces",
"Websites",
"Prozessautomatisierung",
"Web3-Frontends",
],
catalogName: "Leistungen",
},
nav: {
contact: "Kontakt",
freelance: "Freelance",
contactLong: GET_IN_TOUCH,
logoLabel: "Marc Mintel, nach oben",
imprint: "Impressum",
privacy: "Datenschutz",
backToTop: "Nach oben",
language: "Sprache",
languageNames: { en: "English", de: "Deutsch" },
},
hero: {
headline: [
{ text: "WEB-APPS", tone: "solid" },
{ text: "& WEBSITES.", tone: "bits" },
],
lead: "Freelance-Webentwickler mit 15 Jahren Erfahrung.",
leadStrong: "Ich baue Web-Apps, Interfaces und Websites.",
primaryCta: GET_IN_TOUCH,
secondaryCta: "Was ich mache",
trust: ["15 Jahre im Web", "Remote, EU-Kernzeiten"],
builtAndRunning: "Gebaut und in Betrieb:",
},
hello: {
label: "Hallo",
title: "Ich bin Marc.",
lead: "Ich baue seit 15 Jahren für das Web: zuerst in Agenturen, später als Senior-Entwickler und heute selbstständig.",
paragraphs: [
"Meine Stärke ist der Teil, den Menschen sehen und benutzen: Design und Interface. Ich kenne mich auch mit dem aus, was dahinter liegt, und kann deshalb eine vollständige Anwendung bauen und nicht nur ihr Interface.",
"Sie arbeiten direkt mit mir. Egal, ob Sie ein Produktteam leiten oder so etwas zum ersten Mal in Auftrag geben.",
],
portraitAlt: "Marc Mintel, Freelance-Webentwickler",
careerLabel: "Der Weg bisher",
career: [
{ years: "2011", role: "Einstieg ins Web", place: "Ausbildung" },
{ years: "2014 – 2020", role: "Agenturen", place: "Frontend-Entwickler" },
{
years: "2020 – 2023",
role: "Produktunternehmen",
place: "Senior-Softwareentwickler",
},
{
years: "Heute",
role: "Selbstständig",
place: "Direkte Zusammenarbeit mit Kunden",
},
],
},
services: {
label: "Leistungen",
title: { lead: "Was brauchen Sie?", rest: "Vier typische Fälle." },
tablistLabel: "Was brauchen Sie?",
youGet: "Das bekommen Sie",
howItRuns: "So läuft es ab",
estimate: {
label: "Was es kostet",
title: "So kommen Sie zu einem Preis",
steps: [
{
title: "Ein Gespräch, etwa 20 Minuten",
text: "Sie erzählen mir, was Sie brauchen.",
},
{
title: "Eine schriftliche Schätzung",
text: "Sie sehen die geschätzten Stunden und was darin enthalten ist.",
},
{
title: "Sie geben ein Budget frei",
text: "Ich rechne die tatsächlichen Stunden ab und sage früh Bescheid, wenn es nicht reicht.",
},
],
orientationLabel: "Zur Orientierung",
net: "Alle Preise netto.",
cta: "Schätzung anfragen",
freelance: "Buchung und Preise für Teams",
},
paths: [
{
id: "developer",
service: "Entwicklung von Web-Apps und Frontends",
need: "Wir brauchen einen Entwickler für unser Produkt",
forWhom: "Start-ups, Produktteams, Agenturen, Web3-Teams",
headline: "Ein erfahrener Entwickler, der in Ihr Projekt einsteigt.",
intro:
"Sie haben ein Produkt und mehr Arbeit, als Ihr Team schafft. Ich arbeite an vereinbarten Wochentagen an dem, was als Nächstes auf Ihrer Liste steht: neue Funktionen, das Interface oder die Teile, zu denen niemand kommt.",
youGet: [
"Web-Apps, Dashboards, Kundenportale und interne Werkzeuge",
"Interfaces mit Blick für Design und Bedienbarkeit",
"Web3-Frontends: Wallet-Anbindung, Live-Daten, Dashboards",
"Kleine Werkzeuge und Automatisierung für wiederkehrende Arbeit",
],
steps: [
{
title: FIRST_CALL,
text: "Sie erzählen mir, was Sie bauen und wo Sie Unterstützung brauchen. Wenn ich dafür nicht der Richtige bin, sage ich das.",
},
{
title: "Wir vereinbaren die Tage",
text: "Wie viele Tage pro Woche ich für Sie arbeite und was zuerst drankommt.",
},
{
title: "Ich arbeite die Liste ab",
text: "Fertige Teile gehen zur Durchsicht an Sie, sobald sie fertig sind. Ich erfasse meine Stunden, und Sie sehen, wofür sie angefallen sind.",
},
{
title: "Zwei Wochen Kündigungsfrist",
text: "Die Vereinbarung kann mit zwei Wochen Frist zum Monatsende beendet werden.",
},
],
orientation: "100 EUR pro Stunde, monatsweise gebucht",
orientationNote:
"Sie buchen feste Wochentage für jeweils einen Monat. Abgerechnet werden die Stunden, die ich tatsächlich gearbeitet habe.",
},
{
id: "rescue",
service: "Code-Review und Stabilisierung von Web-Apps",
need: "Unsere App soll zuverlässig werden",
forWhom:
"Teams, deren App schnell gebaut wurde und sich jetzt schwer ändern lässt",
headline:
"Eine Woche, um Ihre App durchzusehen und das Dringendste zu beheben.",
intro:
"Die App läuft, aber Fehler kommen wieder, und kleine Änderungen dauern länger, als sie sollten. Ich nehme mir eine Woche, gehe den Code durch, behebe, was in dieser Zeit möglich ist, und schreibe auf, was ich als Nächstes tun würde.",
youGet: [
"Eine ehrliche Einschätzung: was solide ist und was wackelt",
"Automatisierte Tests für die wichtigsten Teile",
"Die dringendsten Probleme behoben, soweit eine Woche reicht",
"Eine schriftliche Liste der nächsten Schritte, in verständlicher Sprache",
],
steps: [
{
title: FIRST_CALL,
text: "Sie zeigen mir die App und erzählen, wo sie Ärger macht.",
},
{
title: "Eine Woche Arbeit",
text: "Ich lese den Code, ergänze Tests, wo sie am meisten bringen, und behebe die dringendsten Probleme.",
},
{
title: "Eine schriftliche Zusammenfassung",
text: "Was ich gefunden habe, was ich geändert habe und was ich empfehle. So geschrieben, dass Sie es nachvollziehen können, ohne selbst zu entwickeln.",
},
{
title: "Sie entscheiden, wie es weitergeht",
text: "Mit mir, mit Ihrem eigenen Team oder gar nicht.",
},
],
orientation: "3.500 EUR für eine feste Woche",
orientationNote:
"Der Umfang ist eine Woche meiner Zeit, 35 Stunden. Eine Woche behebt nicht alles: Wenn ich im ersten Gespräch sehe, dass sie nicht reicht, um Ihnen zu nützen, sage ich Ihnen das.",
},
{
id: "automation",
service: "Prozessautomatisierung und Systemintegration",
need: "Wir wollen einen Ablauf automatisieren",
forWhom:
"Unternehmen, in denen Menschen Daten zwischen Programmen kopieren oder dieselben Schritte wiederholen",
headline:
"Systeme, die Arbeit aneinander weitergeben, damit Menschen es nicht tun müssen.",
intro:
"Jemand exportiert hier eine Liste, tippt sie dort ein und schreibt eine E-Mail dazu. Ich verbinde die Programme, die Sie schon nutzen, sodass wiederkehrende Schritte von selbst laufen und Ihre Leute die Arbeit machen können, für die man sie braucht.",
youGet: [
"Verbindungen zwischen Ihren Systemen über deren Schnittstellen (APIs)",
"Wiederkehrende Abläufe, die ohne Handarbeit laufen",
"Wo es hilft, Schritte mit KI: sortieren, zusammenfassen, Dokumente lesen",
"Eine kurze Beschreibung, wie es funktioniert, damit es gewartet werden kann",
],
steps: [
{
title: FIRST_CALL,
text: "Sie beschreiben den Ablauf und welche Programme beteiligt sind.",
},
{
title: "Ich sehe mir an, wie es heute läuft",
text: "Schritt für Schritt, mit den Menschen, die es machen. Oft lässt sich ein Teil automatisieren, nicht alles.",
},
{
title: "Ich verbinde die Systeme",
text: "Einen Schritt nach dem anderen. Sie testen es mit echten Fällen, bevor es die Handarbeit ersetzt.",
},
{
title: "Es läuft von selbst",
text: "Sie bekommen eine Notiz dazu, was es tut und was zu prüfen ist, wenn sich eines der Programme ändert.",
},
],
orientation: "100 EUR pro Stunde, nach Schätzung",
orientationNote:
"Wie lange es dauert, hängt vom Ablauf ab. Deshalb gibt es keinen Preis, bevor ich ihn gesehen habe. Gebühren für die Programme selbst zahlen Sie.",
},
{
id: "website",
service: "Gestaltung und Entwicklung von Websites",
need: "Ich brauche einfach eine Website",
forWhom:
"Unternehmen und Selbstständige, die sich nicht selbst darum kümmern wollen",
headline: "Eine Website, für Sie gebaut und betreut.",
intro:
"Sie wollen keinen Website-Baukasten lernen und sich nicht mit Hosting beschäftigen. Sie sagen mir, was Ihr Unternehmen macht und was die Seite erreichen soll. Ich gestalte sie, baue sie und bringe sie online.",
youGet: [
"Ein Design für Ihr Unternehmen, keine Vorlage",
"Funktioniert auf Handy, Tablet und Desktop",
"Um das Hosting kümmere ich mich, Sie betreuen keinen Server",
"Änderungen per E-Mail: Sie schreiben, was Sie brauchen, ich setze es um",
],
steps: [
{
title: FIRST_CALL,
text: "Sie erzählen mir von Ihrem Unternehmen und wofür die Website da ist.",
},
{
title: "Ein Entwurf zum Ansehen",
text: "Sie bekommen eine erste Version zum Durchklicken. Wir passen sie an, bis sie passt.",
},
{
title: "Ich baue sie und bringe sie online",
text: "Mit Ihren Texten und Bildern und einem Kontaktformular. Sie geben sie frei, bevor sie live geht.",
},
{
title: "Änderungen danach",
text: "Ein neues Foto oder ein geänderter Preis: Sie schreiben mir eine E-Mail.",
},
],
orientation: "Ab 3.800 EUR, einmalig",
orientationNote:
"Das gilt für eine typische Unternehmenswebsite. Hosting und kleine Änderungen danach kosten einen monatlichen Betrag, den wir vor dem Start vereinbaren.",
},
],
scenes: {
you: "Sie",
me: "Ich",
talkLength: "etwa 20 Minuten",
days: ["Mo", "Di", "Mi", "Do", "Fr"],
daysNote: "zum Beispiel drei Tage pro Woche",
review: "fertige Teile gehen an Sie zur Durchsicht",
week: "Woche {n}",
monthEnd: "Monatsende",
notice: "zwei Wochen Frist",
repair: "Wackliges wird getestet und behoben",
summaryParts: ["gefunden", "geändert", "als Nächstes"],
summaryNote: "so geschrieben, dass Sie folgen können",
options: ["weiter mit mir", "Ihr eigenes Team", "hier aufhören"],
online: "online",
exampleDomain: "ihrefirma.de",
firstVersion: "eine erste Version zum Durchklicken",
approve: "Sie geben frei, bevor es live geht",
changeByEmail: "Sie schreiben, ich setze es um",
tools: ["Shop", "Buchhaltung", "E-Mail", "CRM"],
byHand: "heute: von Hand kopiert",
wiring: "Schritt für Schritt verbunden",
running: "die Schritte laufen ohne Handarbeit",
},
},
automation: {
label: "Prozessautomatisierung",
title: { lead: "Lassen Sie die Systeme", rest: "das Kopieren übernehmen." },
intro:
"In den meisten Unternehmen tragen Menschen Informationen von einem Programm ins andere: hier lesen, dort eintippen, eine E-Mail dazu schreiben. Automatisierung verbindet diese Programme, sodass die Arbeit von selbst vom einen zum nächsten wandert. Drei typische Beispiele:",
examplesLabel: "Beispielabläufe",
running: "läuft",
runComplete: "Durchlauf fertig",
log: "Protokoll",
byHand: "Von Hand",
automated: "Automatisiert",
kinds: {
trigger: "Auslöser: etwas passiert",
rule: "Regel: eine feste Prüfung",
ai: "KI-Schritt: liest oder sortiert",
action: "Aktion: ein System tut etwas",
human: "Mensch: entscheidet die unklaren Fälle",
},
workflows: {
order: {
name: "Bestellung bis Rechnung",
summary:
"Im Shop geht eine neue Bestellung ein. Rechnung, Kundendatensatz und Bestätigung folgen, ohne dass jemand tippt.",
byHand:
"Jemand öffnet die Bestellung, schreibt die Rechnung, aktualisiert den Kundendatensatz und verschickt eine E-Mail.",
automated:
"Die Bestellung stößt alles an. Menschen sehen nur das fertige Ergebnis.",
nodes: {
shop: {
system: "Shop",
label: "Neue Bestellung",
log: "Bestellung eingegangen",
},
stock: {
system: "Regel",
label: "Auf Lager?",
log: "Bestand geprüft: verfügbar",
},
invoice: {
system: "Buchhaltung",
label: "Rechnung erstellen",
log: "Rechnung erstellt",
},
crm: {
system: "CRM",
label: "Kunde aktualisieren",
log: "Kundendatensatz aktualisiert",
},
mail: {
system: "E-Mail",
label: "Bestätigung senden",
log: "Bestätigung verschickt",
},
},
},
documents: {
name: "Eingehende Dokumente",
summary:
"Rechnungen kommen als PDF per E-Mail. Ein KI-Schritt liest sie, eine Regel prüft das Ergebnis, und ein Mensch sieht nur die unklaren Fälle.",
byHand:
"Jemand öffnet jedes PDF, liest Lieferant, Betrag und Datum ab und tippt sie in die Buchhaltung.",
automated:
"Klare Fälle werden direkt gebucht. Unklare gehen mit dem Dokument im Anhang an einen Menschen.",
nodes: {
inbox: {
system: "Posteingang",
label: "E-Mail mit PDF",
log: "Dokument eingegangen",
},
read: {
system: "KI-Schritt",
label: "Dokument lesen",
log: "Lieferant, Betrag und Datum ausgelesen",
},
check: { system: "Regel", label: "Plausibel?", log: "Werte geprüft" },
book: {
system: "Buchhaltung",
label: "Buchen",
log: "automatisch gebucht",
},
ask: {
system: "Ein Mensch",
label: "Prüfen, entscheiden",
log: "unklar: zur Prüfung an einen Menschen",
},
},
},
lead: {
name: "Anfrage bis Nachfassen",
summary:
"Jemand füllt das Kontaktformular aus. Der Kontakt wird angelegt, die richtige Person erfährt davon, und eine Erinnerung sorgt dafür, dass niemand es vergisst.",
byHand:
"Jemand kopiert die Anfrage ins CRM, leitet sie per E-Mail weiter und hofft, dass das Nachfassen nicht vergessen wird.",
automated:
"Die Anfrage wird abgelegt, zugewiesen und zum geplanten Zeitpunkt nachverfolgt.",
nodes: {
form: {
system: "Website",
label: "Kontaktformular",
log: "Anfrage eingegangen",
},
contact: {
system: "CRM",
label: "Kontakt anlegen",
log: "Kontakt angelegt",
},
notify: {
system: "Team-Chat",
label: "Vertrieb informieren",
log: "Vertrieb informiert",
},
wait: {
system: "Regel",
label: "Nach 3 Tagen offen?",
log: "Nachfassen eingeplant",
},
remind: {
system: "Aufgaben",
label: "Erinnerung anlegen",
log: "Erinnerung angelegt",
},
},
},
},
notes: [
{
title: "Wann es sich lohnt",
items: [
"Dieselben Schritte wiederholen sich täglich oder wöchentlich",
"Daten werden von einem Programm ins andere getippt",
"Fehler passieren, weil die Arbeit eintönig ist",
],
},
{
title: "Was bei Menschen bleibt",
items: [
"Entscheidungen und Ausnahmen",
"Alles, was ein Kunde von einem Menschen hören sollte",
"Das letzte Wort, wenn die Automatisierung unsicher ist",
],
},
{
title: "Was ich von Ihnen brauche",
items: [
"Zugang zu den Programmen und ihren Schnittstellen (APIs)",
"Jemanden, der den Ablauf so kennt, wie er heute gemacht wird",
"Echte Beispiele zum Testen",
],
},
],
},
presentations: {
label: "Web-Präsentationen",
title: { lead: "Eine Präsentation als Link.", rest: "Nicht als Anhang." },
intro:
"Die meisten Präsentationen sind noch Foliendateien: ein festes Format, verschickt als Anhang. Ich baue Präsentationen als Websites. Sie öffnen sich in jedem Browser, passen sich dem Bildschirm an, auf dem sie gezeigt werden, und können Dinge enthalten, die eine Folie nicht kann.",
compare: {
description:
"Eine Folie behält auf jedem Bildschirm ihr festes Format und wird auf dem Handy zu klein zum Lesen. Eine Web-Präsentation ordnet ihren Inhalt für jeden Bildschirm neu an.",
slides: "Foliendatei",
web: "Web-Präsentation",
pickScreen: "Gezeigt auf",
screens: ["Beamer", "Laptop", "Handy"],
slideNotes: [
"Für dieses Format gemacht",
"Passt noch",
"Verkleinert: zu klein zum Lesen",
],
webNotes: [
"Nutzt die volle Breite",
"Zwei Spalten",
"Eine Spalte, gut lesbar",
],
},
reasons: [
{
title: "Passt auf jeden Bildschirm",
text: "Eine Folie hat ein festes Format. Eine Web-Präsentation ordnet sich für Beamer, Laptop und Handy jeweils neu an.",
},
{
title: "Ein Link, ein Stand",
text: "Niemand muss fragen, welche Datei die aktuelle ist. Sie ändern es an einer Stelle, und jeder, der den Link öffnet, sieht diesen Stand.",
},
{
title: "Zeigt das Echte",
text: "Aktuelle Zahlen, eine funktionierende Demo oder ein klickbarer Prototyp können direkt in der Präsentation stehen, statt eines Screenshots davon.",
},
{
title: "Auch danach noch nützlich",
text: "Nach dem Termin ist sie eine Seite, die man allein lesen, weitergeben und wiederfinden kann.",
},
],
goodFor: {
title: "Typische Einsätze",
items: [
"Unternehmens- und Produktpräsentationen",
"Pitches und Angebote, die als Link verschickt werden",
"Berichte mit Zahlen, die sich ändern",
"Bildschirme auf Messen und Veranstaltungen",
],
},
honest: {
title: "Wann Folien reichen",
text: "Für einen einzelnen internen Termin ist eine Foliendatei schneller und günstiger. Eine Web-Präsentation lohnt sich, wenn sie oft gezeigt wird, an viele Menschen geht oder für Ihr Unternehmen steht.",
},
cta: "Nach einer Präsentation fragen",
},
story: {
services: "So viel zu mir. Jetzt zu Ihnen.",
automation: "Einen dieser Fälle zeige ich genauer.",
presentations: "Und manchmal ist das Richtige gar keine App.",
working: "Egal, was Sie brauchen: So läuft die Zusammenarbeit.",
work: "Und so sieht das Ergebnis aus.",
faq: "Bleiben die Fragen, die fast immer kommen.",
},
freelance: {
metaTitle: "Freelance-Webentwickler für Ihr Team | Marc Mintel",
metaDescription:
"Für welche Projekte ich passe, womit ich arbeite (React, Next.js, TypeScript) und wie ich Änderungen absichere, bevor sie live gehen.",
label: "Freelance",
title: {
lead: "Ein Entwickler für Ihr Team.",
rest: "Die technischen Details.",
},
intro:
"Diese Seite ist für alle, die selbst entwickeln oder ein Team leiten: für welche Projekte ich passe, womit ich arbeite und wie ich Änderungen absichere, bevor sie live gehen.",
pipelineLabel: "Absicherung",
booking: {
label: "Buchung",
title: { lead: "Gebucht wird monatsweise.", rest: "Nicht tageweise." },
text: "Ich arbeite an festen Wochentagen an Ihrem Projekt, vereinbart für jeweils einen Monat. Es gibt kein Paket zu kaufen: Sie zahlen die Stunden, die ich tatsächlich gearbeitet habe.",
rate: { label: "Pro Stunde", amount: "100 EUR", note: "netto" },
example: {
label: "Beispiel: 2 Tage pro Woche",
amount: "ca. 6.400 EUR",
note: "64 Stunden in vier Wochen, netto",
},
terms: [
"Feste Wochentage, vereinbart für jeweils einen Monat",
"Eine Rechnung pro Monat, mit den erfassten Stunden",
"Beide Seiten können mit zwei Wochen Frist zum Monatsende kündigen",
"Einzelne Tage buche ich nicht",
],
cta: "Verfügbarkeit anfragen",
},
teaser: {
title: "Sie entwickeln selbst oder leiten ein Team?",
text: "Für welche Projekte ich passe, womit ich arbeite und wie ich Änderungen absichere, steht auf einer eigenen Seite.",
cta: "Zu den technischen Details",
},
},
technology: {
label: "Technik",
title: { lead: "Für welche Projekte", rest: "ich der Richtige bin." },
fit: [
{
title: "Passt gut",
items: [
"Web-Apps: Dashboards, Portale, interne Werkzeuge",
"Interfaces, bei denen Design und Bedienbarkeit zählen",
"Unternehmenswebsites, auch in mehreren Sprachen",
"Web3-Frontends: Wallets, Live-Daten, Dashboards",
"Automatisierung: Systeme und ihre APIs verbinden",
],
},
{
title: "Auch möglich",
items: [
"Das Backend, das eine App braucht: APIs, Login, Integrationen",
"Werkzeuge für die Kommandozeile",
"Bestehenden Code übernehmen und aufräumen",
],
},
{
title: "Nicht mein Gebiet",
items: [
"Mobile Apps für die App-Stores",
"Windows-Software",
"Serverbetrieb, spezialisierte Datenbankarbeit",
],
},
],
techLabel: "Womit ich arbeite",
tech: [
{
area: "Interface",
items: ["TypeScript", "React", "Next.js", "Vue.js", "Tailwind CSS"],
},
{
area: "Dahinter",
items: ["Node.js", "REST APIs", "PostgreSQL", "Headless CMS"],
},
{ area: "Web3 und Systeme", items: ["Solidity", "Rust"] },
{
area: "Auslieferung",
items: ["Automatisierte Tests", "Docker", "CI/CD"],
},
],
pipelineTitle: "Was passiert, bevor eine Änderung live geht.",
pipelineIntro:
"Software hängt zusammen: Eine Änderung an einer Stelle kann eine andere kaputt machen. Ich sichere mit automatisierten Tests ab, was ich baue, und jede Änderung muss sie bestehen, bevor sie veröffentlicht wird. So sieht ein solcher Durchlauf aus.",
pipeline: {
simulate: "Änderung simulieren in",
scenarios: {
orders: {
label: "Bestellungen",
testName: "Rechnungssumme passt zur rabattierten Bestellung",
expected: "119.00",
received: "125.00",
},
login: {
label: "Login",
testName: "Bestätigung geht an die E-Mail-Adresse des Kontos",
expected: '"anna@example.com"',
received: "undefined",
},
invoices: {
label: "Rechnungen",
testName: "Rechnungs-E-Mail hat das PDF im Anhang",
expected: "1 Anhang",
received: "0 Anhänge",
},
emails: {
label: "E-Mails",
testName:
"Bestellung ist bestätigt, sobald die E-Mail eingereiht ist",
expected: '"bestätigt"',
received: '"offen"',
},
},
stages: ["Lint", "Typen", "Tests", "Deploy"],
explanations: [
{
title: "Eine Änderung kommt herein",
text: "Im Bereich {area} wird etwas geändert. Bevor es live gehen kann, wird das ganze Projekt automatisch geprüft.",
},
{
title: "Ein Test schlägt fehl, die Freigabe ist gesperrt",
text: "Die Änderung hat an einer anderen Stelle etwas kaputt gemacht. Das fällt hier auf, bei mir, und nichts davon erreicht Ihre Nutzer.",
},
{
title: "Behoben, erneut geprüft, veröffentlicht",
text: "Ich repariere, was kaputtgegangen ist, der Durchlauf besteht, und erst dann geht die Änderung live.",
},
],
runAgain: "Erneut starten",
run: "Lauf",
fixPushed: "Korrektur eingespielt",
lint: "$ lint: prüft den Code-Stil…",
types: "$ types: prüft, ob die Teile zusammenpassen…",
tests: "Tests",
expected: "erwartet",
received: "erhalten",
runningFile: "läuft: {file}…",
summaryLabel: "Tests",
failed: "{n} fehlgeschlagen",
passed: "{n} bestanden",
of: "von {total}",
pending: "Freigabe offen",
blocked: "Freigabe gesperrt",
released: "veröffentlicht",
footnote:
"Eine Illustration mit erfundenen Dateinamen und Zahlen, einem echten Testlauf nachempfunden. Tests finden nicht jeden Fehler, aber diese Art schon.",
},
},
working: {
label: "Zusammenarbeit",
title: { lead: "So arbeite ich.", rest: "Nichts Ungewöhnliches." },
principles: [
{
title: "Ein Ansprechpartner",
text: "Sie sprechen mit mir, und ich bin derjenige, der die Arbeit macht.",
},
{
title: "Stunden, die Sie nachprüfen können",
text: "Ich erfasse meine Zeit. Die Monatsrechnung zeigt, wofür die Stunden angefallen sind.",
},
{
title: "Sorgfältige Arbeit",
text: "Ich teste, was ich baue, bevor ich es übergebe, und sage es, wenn etwas noch nicht fertig ist oder ich mir nicht sicher bin.",
},
{
title: "Was ich baue, gehört Ihnen",
text: "Code und Design gehören Ihnen. Sie können beides an einen anderen Entwickler übergeben.",
},
],
diagram: {
description:
"Oft geht eine Anfrage durch mehrere Hände, bevor sie beim Entwickler ankommt. Bei mir gibt es eine direkte Leitung zwischen Ihnen und dem, der die Arbeit macht.",
chain: ["Sie", "Vertrieb", "Manager", "Designer", "Entwickler"],
you: "Sie",
me: "Ich",
often: "oft",
withMe: "bei mir",
oftenLong: "oft: eine Anfrage wird weitergereicht",
withMeLong: "bei mir: eine direkte Leitung",
},
},
work: {
label: "Meine Arbeit",
title: {
lead: "Zwei Websites, die ich gebaut habe.",
rest: "Beide sind live.",
},
items: {
"klz-cables.com": {
client: "Kabellieferant",
text: "Die Unternehmenswebsite eines Lieferanten für Energiekabel, auf Deutsch und Englisch.",
did: [
"Produktkatalog mit Kategorien und Detailseiten",
"Datenblätter, erzeugt aus den Produktdaten",
"Inhalte, die der Kunde in einem CMS pflegen kann",
],
tech: ["Next.js", "TypeScript", "Headless CMS", "Zwei Sprachen"],
},
"e-tib.com": {
client: "Kabelnetzbau",
text: "Die Unternehmenswebsite einer Gruppe im Kabelnetzbau, auf Deutsch und Englisch.",
did: [
"Seiten für Leistungen, Referenzen, Karriere und Veranstaltungen",
"Dieselben Inhalte in zwei Sprachen",
"Funktioniert auf Handy, Tablet und Desktop",
],
tech: ["Next.js", "TypeScript", "Headless CMS", "Zwei Sprachen"],
},
},
openLive: "Live-Website öffnen",
desktopAlt: "{name} auf einem Desktop-Bildschirm",
phoneAlt: "{name} auf einem Handy",
note: "Neben der Arbeit für Kunden baue ich eigene Software, unter anderem ein System in Rust und Solidity, das auf sieben Blockchains läuft.",
},
faq: {
label: "Fragen",
title: { lead: "Gut zu wissen,", rest: "bevor wir sprechen." },
items: [
{
question: "Ich bin kein Technikmensch. Ist das ein Problem?",
answer:
"Nein. Ich erkläre in verständlicher Sprache, was ich tue, und Sie können jederzeit nachfragen. Code müssen Sie nicht lesen.",
},
{
question: "Wie lange bin ich gebunden?",
answer:
"Projektarbeit wird nach Aufwand abgerechnet. Beide Seiten können mit zwei Wochen Frist zum Monatsende kündigen.",
},
{
question: "Wem gehört, was Sie bauen?",
answer:
"Ihnen. Code und Design gehören Ihnen, und Sie können beides an einen anderen Entwickler übergeben.",
},
{
question: "Können Sie mit unserem bestehenden Team und Code arbeiten?",
answer:
"Ja. Ich habe jahrelang in Agenturen und Produktteams gearbeitet, der Einstieg in ein bestehendes Projekt ist mir vertraut.",
},
{
question: "Wie erreiche ich Sie?",
answer:
"Per E-Mail oder Videocall. Ich arbeite remote und bin zu europäischen Geschäftszeiten erreichbar.",
},
{
question: "Was machen Sie nicht?",
answer:
"Mobile Apps für die App-Stores, Windows-Software und den Betrieb Ihrer Server. Wenn Ihr Projekt das braucht, sage ich das im ersten Gespräch.",
},
],
},
contact: {
headline: [
{ text: "REDEN", tone: "bits" },
{ text: "WIR.", tone: "solid" },
],
lead: "Wählen Sie aus, was Sie brauchen, und die E-Mail schreibt sich von selbst. Oder schreiben Sie mir direkt:",
newMessage: "Neue Nachricht",
draft: "Entwurf",
need: "Ich brauche",
to: "an",
subject: "Betreff",
open: "Im E-Mail-Programm öffnen",
copy: "Adresse kopieren",
copied: "Kopiert",
// The square brackets are blanks for the visitor to fill in.
topics: [
{
id: "developer",
label: "Einen Entwickler",
draft: {
subject: "Ein Entwickler für unser Produkt",
body: `${GREETING}\n\nwir arbeiten an [was Sie bauen] und brauchen Unterstützung bei [was als Nächstes ansteht].\n\nEin erstes Gespräch würde uns um den [Datum oder Woche] passen.\n\n${SIGN_OFF}`,
},
},
{
id: "rescue",
label: "Eine zuverlässige App",
draft: {
subject: "Unsere App soll zuverlässig werden",
body: `${GREETING}\n\nunsere App [Name oder kurze Beschreibung] läuft, aber [was immer wieder schiefgeht].\n\nKönnten Sie sich das ansehen?\n\n${SIGN_OFF}`,
},
},
{
id: "automation",
label: "Automatisierung",
draft: {
subject: "Wir möchten einen Ablauf automatisieren",
body: `${GREETING}\n\nwir möchten [den Ablauf] automatisieren. Heute wird er von Hand in [beteiligte Programme] erledigt.\n\nKönnen wir darüber sprechen?\n\n${SIGN_OFF}`,
},
},
{
id: "website",
label: "Eine Website",
draft: {
subject: "Eine Website für mein Unternehmen",
body: `${GREETING}\n\nich brauche eine Website für [Ihr Unternehmen]. Sie soll [wofür sie da ist].\n\nWann könnten wir sprechen?\n\n${SIGN_OFF}`,
},
},
{
id: "other",
label: "Etwas anderes",
draft: {
subject: "Eine Frage",
body: `${GREETING}\n\n[was Sie vorhaben]\n\n${SIGN_OFF}`,
},
},
],
},
notFound: {
kicker: "Fehler 404",
title: "Seite nicht gefunden.",
text: "Diese Adresse gibt es nicht. Die Seite wurde vielleicht verschoben oder entfernt.",
home: "Zur Startseite",
},
error: {
kicker: "Fehler 500",
title: "Etwas ist schiefgelaufen.",
text: "Ein unerwartetes Problem ist aufgetreten. Es wurde protokolliert.",
retry: "Erneut versuchen",
home: "Zur Startseite",
},
};