Restore hero word accents and German umlauts
CI / quality (push) Waiting to run

This commit is contained in:
MOH
2026-03-09 08:58:04 +01:00
parent 25786ccf1d
commit 701c1b2a6c
3 changed files with 52 additions and 37 deletions
+18 -3
View File
@@ -10,11 +10,26 @@ type PageHeroProps = {
}; };
function getDefaultLines(title: string): HeroTitleLineValue[] { function getDefaultLines(title: string): HeroTitleLineValue[] {
return title.split("\n").filter(Boolean).map((line, index) => ({ return title.split("\n").filter(Boolean).map((line) => {
const words = line.trim().split(/\s+/).filter(Boolean);
if (words.length <= 1) {
return {
text: line, text: line,
tone: index === 0 ? "soft" : "accent", tone: "soft",
align: "center", align: "center",
})); };
}
return {
text: line,
align: "center",
segments: words.map((word, index) => ({
text: index === words.length - 1 ? word : `${word} `,
tone: index % 2 === 0 ? "soft" : "accent",
})),
};
});
} }
export function PageHero({ badge, title, description, lines, locale }: PageHeroProps) { export function PageHero({ badge, title, description, lines, locale }: PageHeroProps) {
+31 -31
View File
@@ -6,8 +6,8 @@
"about": "Über mich", "about": "Über mich",
"contact": "Kontakt", "contact": "Kontakt",
"root": "Root", "root": "Root",
"openMenu": "Menue oeffnen", "openMenu": "Menü öffnen",
"closeMenu": "Menue schliessen", "closeMenu": "Menü schliessen",
"themeToggle": "Theme wechseln", "themeToggle": "Theme wechseln",
"soundMute": "Sounds stummschalten", "soundMute": "Sounds stummschalten",
"soundUnmute": "Sounds aktivieren" "soundUnmute": "Sounds aktivieren"
@@ -19,21 +19,21 @@
"badge": "Coming Soon", "badge": "Coming Soon",
"kicker": "Hi, ich bin Moh", "kicker": "Hi, ich bin Moh",
"titleLineOne": "Eine klarere", "titleLineOne": "Eine klarere",
"titleLineTwo": "naechste Version", "titleLineTwo": "nächste Version",
"titleLineThree": "ist unterwegs.", "titleLineThree": "ist unterwegs.",
"description": "Die neue Version entsteht gerade mit staerkerer Identitaet, klarerem Inhalt und einer fokussierteren Erfahrung von Anfang bis Ende.", "description": "Die neue Version entsteht gerade mit stärkerer Identität, klarerem Inhalt und einer fokussierteren Erfahrung von Anfang bis Ende.",
"note": "Wenn du schon ein Projekt im Kopf hast, kannst du dich jetzt melden und wir starten frueh ins Gespraech.", "note": "Wenn du schon ein Projekt im Kopf hast, kannst du dich jetzt melden und wir starten früh ins Gespräch.",
"primaryCta": "Kontakt aufnehmen", "primaryCta": "Kontakt aufnehmen",
"secondaryCta": "Zur Startseite" "secondaryCta": "Zur Startseite"
}, },
"homepage": { "homepage": {
"heroKicker": "Hi, ich bin Moh", "heroKicker": "Hi, ich bin Moh",
"heroTitle": "frontend\ndeveloper\n& designer", "heroTitle": "frontend\ndeveloper\n& designer",
"heroText": "Ich entwickle digitale Loesungen fuer echte Probleme,\ndie gut aussehen und sauber funktionieren.", "heroText": "Ich entwickle digitale Lösungen für echte Probleme,\ndie gut aussehen und sauber funktionieren.",
"servicesEyebrow": "Leistungen", "servicesEyebrow": "Leistungen",
"servicesTitle": "Digitale Arbeit, die sich an deinem Geschaeft orientiert und nicht an Vorlagen.", "servicesTitle": "Digitale Arbeit, die sich an deinem Geschäft orientiert und nicht an Vorlagen.",
"servicesText": "Von Markenaufbau und Websites bis zu Shops, SEO, Tracking, WordPress Plugins und internen Systemen geht es immer um dasselbe: mehr Klarheit, bessere Wirkung und eine saubere Grundlage fuer Wachstum.", "servicesText": "Von Markenaufbau und Websites bis zu Shops, SEO, Tracking, WordPress Plugins und internen Systemen geht es immer um dasselbe: mehr Klarheit, bessere Wirkung und eine saubere Grundlage für Wachstum.",
"servicesPrimaryCta": "Erzaehl mir von deinem Projekt", "servicesPrimaryCta": "Erzähl mir von deinem Projekt",
"servicesSecondaryCta": "Meine Arbeiten ansehen", "servicesSecondaryCta": "Meine Arbeiten ansehen",
"serviceBrand": "Markenaufbau mit klarer Richtung.", "serviceBrand": "Markenaufbau mit klarer Richtung.",
"serviceWebsite": "Websites mit sauberer Struktur.", "serviceWebsite": "Websites mit sauberer Struktur.",
@@ -41,35 +41,35 @@
"serviceWordPress": "Eigene WordPress Plugins.", "serviceWordPress": "Eigene WordPress Plugins.",
"serviceSeo": "Mehr Sichtbarkeit in Suchmaschinen.", "serviceSeo": "Mehr Sichtbarkeit in Suchmaschinen.",
"serviceTracking": "Tracking und bessere Auswertung.", "serviceTracking": "Tracking und bessere Auswertung.",
"serviceSystem": "Interne Systeme fuer Teams und Firmen.", "serviceSystem": "Interne Systeme für Teams und Firmen.",
"toPortfolio": "Portfolio ansehen", "toPortfolio": "Portfolio ansehen",
"toProducts": "Produkte ansehen", "toProducts": "Produkte ansehen",
"toContact": "Kontakt aufnehmen" "toContact": "Kontakt aufnehmen"
}, },
"portfolioPage": { "portfolioPage": {
"title": "Portfolio", "title": "Portfolio",
"heroBadge": "Ausgewaehlte Arbeiten", "heroBadge": "Ausgewählte Arbeiten",
"heroTitle": "Ausgewaehlte Projekte", "heroTitle": "Portfolio",
"intro": "Eine Auswahl von Projekten mit Fokus auf Klarheit und Ergebnis.", "intro": "Eine Auswahl von Projekten mit Fokus auf Klarheit und Ergebnis.",
"open": "Projekt oeffnen", "open": "Projekt öffnen",
"all": "Alle Kategorien", "all": "Alle Kategorien",
"empty": "Fuer diesen Filter sind noch keine veroeffentlichten Projekte vorhanden." "empty": "Für diesen Filter sind noch keine veröffentlichten Projekte vorhanden."
}, },
"productsPage": { "productsPage": {
"title": "Produkte", "title": "Produkte",
"heroBadge": "Pakete und Loesungen", "heroBadge": "Pakete und Lösungen",
"heroTitle": "Klare Angebote", "heroTitle": "Klare Angebote",
"intro": "Pakete fuer Teams von Start bis Skalierung.", "intro": "Pakete für Teams von Start bis Skalierung.",
"open": "Produkt oeffnen" "open": "Produkt öffnen"
}, },
"aboutPage": { "aboutPage": {
"title": "Ueber mich", "title": "Über mich",
"heroBadge": "Mehr ueber mich", "heroBadge": "Mehr über mich",
"heroTitle": "Ueber mich", "heroTitle": "Über mich",
"intro": "Ich baue klare digitale Erlebnisse fuer Marken, Produkte und Teams.", "intro": "Ich baue klare digitale Erlebnisse für Marken, Produkte und Teams.",
"valuesTitle": "Wie ich arbeite", "valuesTitle": "Wie ich arbeite",
"valueA": "Strategie zuerst", "valueA": "Strategie zuerst",
"valueAText": "Jedes Projekt startet mit Zielbild, Scope und Prioritaeten.", "valueAText": "Jedes Projekt startet mit Zielbild, Scope und Prioritäten.",
"valueB": "Saubere Systeme", "valueB": "Saubere Systeme",
"valueBText": "Ich setze auf wartbare Komponenten und klare Strukturen.", "valueBText": "Ich setze auf wartbare Komponenten und klare Strukturen.",
"valueC": "Enge Zusammenarbeit", "valueC": "Enge Zusammenarbeit",
@@ -89,30 +89,30 @@
"phone": "Telefon", "phone": "Telefon",
"company": "Firma", "company": "Firma",
"message": "Nachricht", "message": "Nachricht",
"note": "Teile kurz Kontext, Ziel und Deadline mit, damit die Antwort praeziser ausfallen kann.", "note": "Teile kurz Kontext, Ziel und Deadline mit, damit die Antwort präziser ausfallen kann.",
"submit": "Senden", "submit": "Senden",
"preview": "Success Seite ansehen", "preview": "Success Seite ansehen",
"city": "Berlin, Deutschland" "city": "Berlin, Deutschland"
}, },
"successPage": { "successPage": {
"title": "Danke fuer deine Nachricht", "title": "Danke für deine Nachricht",
"text": "Ich habe deine Anfrage erhalten und melde mich zeitnah.", "text": "Ich habe deine Anfrage erhalten und melde mich zeitnah.",
"home": "Zur Startseite", "home": "Zur Startseite",
"contact": "Zur Kontaktseite" "contact": "Zur Kontaktseite"
}, },
"portfolioDetail": { "portfolioDetail": {
"back": "Zurueck zum Portfolio", "back": "Zurück zum Portfolio",
"preview": "Vorschau oeffnen", "preview": "Vorschau öffnen",
"openLink": "Link oeffnen", "openLink": "Link öffnen",
"gallery": "Projektgalerie", "gallery": "Projektgalerie",
"download": "Dokument oeffnen" "download": "Dokument öffnen"
}, },
"productDetail": { "productDetail": {
"back": "Zurueck zu Produkten", "back": "Zurück zu Produkten",
"included": "Inklusive", "included": "Inklusive",
"stepOne": "Kickoff und Scope Klarheit", "stepOne": "Kickoff und Scope Klarheit",
"stepTwo": "Setup von Design und Komponenten", "stepTwo": "Setup von Design und Komponenten",
"stepThree": "Implementierung und Uebergabe", "stepThree": "Implementierung und Übergabe",
"action": "Kontakt fuer Angebot" "action": "Kontakt für Angebot"
} }
} }
+1 -1
View File
@@ -49,7 +49,7 @@
"portfolioPage": { "portfolioPage": {
"title": "Portfolio", "title": "Portfolio",
"heroBadge": "Selected work", "heroBadge": "Selected work",
"heroTitle": "Selected work", "heroTitle": "Portfolio",
"intro": "Selected projects with a focus on clarity and outcomes.", "intro": "Selected projects with a focus on clarity and outcomes.",
"open": "Open project", "open": "Open project",
"all": "All categories", "all": "All categories",