feat: German as the main language, English under /en, with a language switch

The site now exists in German (at the root, with /impressum and /datenschutz)
and English (/en). A request without a language follows the visitor's choice
from the language switch, then the browser language, then German; the old
English legal addresses move to /en for good.

All visible texts are data in src/content/de.ts and en.ts, so components hold
none of their own. The header carries a DE/EN switch whose bit curtain covers
the page while it is swapped and reopens at the same reading position. Title,
description, canonical, hreflang, Open Graph, the share image, the sitemap and
the structured data are per language. The privacy notice now describes the
cookie that remembers the chosen language.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-04 13:07:22 +02:00
co-authored by Claude Opus 5.5
parent e89a248ca5
commit 75993100fa
72 changed files with 4418 additions and 1405 deletions
+731
View File
@@ -0,0 +1,731 @@
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, Oberflächen 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",
"Benutzeroberflächen",
"Websites",
"Prozessautomatisierung",
"Web3-Frontends",
],
catalogName: "Leistungen",
},
nav: {
contact: "Kontakt",
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, Oberflächen 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 Oberfläche. Ich kenne mich auch mit dem aus, was dahinter liegt, und kann deshalb eine vollständige Anwendung bauen und nicht nur ihre Oberfläche.",
"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",
whatItCosts: "Das kostet es",
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, die Oberfläche oder die Teile, zu denen niemand kommt.",
youGet: [
"Web-Apps, Dashboards, Kundenportale und interne Werkzeuge",
"Oberflächen 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.",
},
],
pricingModel: "Nach Aufwand, solange Ihr Projekt läuft",
pricingText:
"Ich arbeite an vereinbarten Wochentagen an Ihrem Projekt und rechne die Stunden ab, die ich tatsächlich gearbeitet habe. Es gibt kein Paket zu kaufen und keine Mindestlaufzeit.",
prices: [
{ label: "Pro Stunde", amount: "100 EUR", note: "netto" },
{ label: "Pro Tag", amount: "800 EUR", note: "8 Stunden, netto" },
],
smallPrint:
"Eine Rechnung pro Monat, mit den erfassten Stunden. Beide Seiten können mit zwei Wochen Frist zum Monatsende kündigen.",
cta: GET_IN_TOUCH,
},
{
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.",
},
],
pricingModel: "Eine feste Woche zum festen Preis",
pricingText:
"Der Umfang ist eine Woche meiner Zeit. Sie kennen die Kosten, bevor ich anfange.",
prices: [
{
label: "Eine Woche, 35 Stunden",
amount: "3.500 EUR",
note: "netto",
},
],
smallPrint:
"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.",
cta: GET_IN_TOUCH,
},
{
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.",
},
],
pricingModel: "Erst eine Schätzung, dann ein Budget",
pricingText:
"Sobald ich den Ablauf gesehen habe, schätze ich die Stunden. Diese Schätzung wird zum Budget. Ich rechne die Stunden ab, die ich tatsächlich gebraucht habe, und sage früh Bescheid, wenn es nicht reicht.",
prices: [{ label: "Pro Stunde", amount: "100 EUR", note: "netto" }],
smallPrint:
"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.",
cta: GET_IN_TOUCH,
},
{
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.",
},
],
pricingModel: "Erst eine Schätzung, dann ein Budget",
pricingText:
"Nach dem ersten Gespräch bekommen Sie eine Schätzung. Sie wird Ihr Budget: Ich rechne die Stunden ab, die tatsächlich angefallen sind. Die Schätzung hält in der Regel, und wenn nicht, sage ich es Ihnen, bevor das Budget aufgebraucht ist.",
prices: [
{
label: "Eine typische Unternehmenswebsite",
amount: "ab 3.800 EUR",
note: "einmalig, netto",
},
{
label: "Alles Weitere, pro Stunde",
amount: "100 EUR",
note: "netto",
},
],
smallPrint:
"Hosting und kleine Änderungen danach kosten einen monatlichen Betrag, den wir vor dem Start vereinbaren. E-Mail-Postfächer verwalte ich nicht; sie bleiben bei Ihrem Anbieter.",
cta: GET_IN_TOUCH,
},
],
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",
],
},
],
},
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",
"Oberflächen, 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: "Oberfläche",
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",
},
};