From b2a30d6573e52ab2b3ac586fc7848b89a227dc97 Mon Sep 17 00:00:00 2001 From: HirenGajjar Date: Wed, 27 May 2026 00:57:52 -0700 Subject: [PATCH] feat: add trilingual /about page with generateMetadata and footer link (closes #29) --- src/app/[lang]/about/page.tsx | 286 ++++++++++++++++++++++ src/app/[lang]/sections/FooterSection.tsx | 1 + 2 files changed, 287 insertions(+) create mode 100644 src/app/[lang]/about/page.tsx diff --git a/src/app/[lang]/about/page.tsx b/src/app/[lang]/about/page.tsx new file mode 100644 index 0000000..a0fde15 --- /dev/null +++ b/src/app/[lang]/about/page.tsx @@ -0,0 +1,286 @@ +import { Metadata } from "next"; +import Link from "next/link"; +import { type Lang, l, LANGUAGES } from "@/lib/i18n"; +import { headlineStyle } from "../data"; + +const BASE_URL = "https://clarvia.org"; + +const META: Record = { + en: { + title: "About Clarvia — Mission, legal identity, and governance", + description: + "Clarvia ASBL is a Luxembourg non-profit building free, multilingual bereavement guidance for families. Learn about our mission, legal structure, and how we work.", + }, + fr: { + title: "À propos de Clarvia — Mission, identité légale et gouvernance", + description: + "Clarvia ASBL est une association sans but lucratif luxembourgeoise qui développe un accompagnement gratuit et multilingue pour les familles en deuil. Découvrez notre mission, notre structure juridique et notre mode de fonctionnement.", + }, + de: { + title: "Über Clarvia — Mission, rechtliche Identität und Governance", + description: + "Clarvia ASBL ist ein gemeinnütziger Verein in Luxemburg, der kostenlose, mehrsprachige Trauerbegleitung für Familien aufbaut. Erfahren Sie mehr über unsere Mission, Rechtsstruktur und Arbeitsweise.", + }, +}; + +export async function generateMetadata({ + params, +}: { + params: Promise<{ lang: string }>; +}): Promise { + const { lang: rawLang } = await params; + const lang = (LANGUAGES.includes(rawLang as Lang) ? rawLang : "en") as Lang; + const meta = META[lang]; + + return { + title: meta.title, + description: meta.description, + alternates: { + canonical: `${BASE_URL}/${lang}/about`, + languages: Object.fromEntries( + LANGUAGES.map((code) => [code, `${BASE_URL}/${code}/about`]) + ), + }, + openGraph: { + title: meta.title, + description: meta.description, + url: `${BASE_URL}/${lang}/about`, + siteName: "Clarvia", + locale: lang, + type: "website", + images: [{ url: `${BASE_URL}/og-image.png`, width: 1200, height: 630 }], + }, + }; +} + +export default async function AboutPage({ + params, +}: { + params: Promise<{ lang: string }>; +}) { + const { lang: rawLang } = await params; + const lang = (LANGUAGES.includes(rawLang as Lang) ? rawLang : "en") as Lang; + + return ( + <> +
+ + Clarvia + + +
+ +
+ +

+ {l(lang, "About Clarvia", "À propos de Clarvia", "Über Clarvia")} +

+ +
+

+ {l(lang, "Our mission", "Notre mission", "Unsere Mission")} +

+

+ {l(lang, + "Clarvia is a Luxembourg non-profit building a free, multilingual bereavement guidance service for families after the loss of a loved one. When someone dies, families must navigate complex administrative processes — often while in shock, often across language barriers, often without knowing where to start.", + "Clarvia est une association sans but lucratif luxembourgeoise qui développe un service d'accompagnement gratuit et multilingue pour les familles après la perte d'un proche. Lorsqu'un décès survient, les familles doivent gérer des démarches administratives complexes — souvent sous le choc, souvent confrontées à des barrières linguistiques, souvent sans savoir par où commencer.", + "Clarvia ist ein gemeinnütziger Verein in Luxemburg, der einen kostenlosen, mehrsprachigen Begleitservice für Familien nach dem Verlust eines nahestehenden Menschen aufbaut. Wenn jemand stirbt, müssen Familien komplexe Verwaltungsprozesse bewältigen — oft unter Schock, oft mit Sprachbarrieren, oft ohne zu wissen, wo sie anfangen sollen." + )} +

+

+ {l(lang, + "Clarvia exists to make that guidance clearer, more accessible, and trustworthy — regardless of language, nationality, income, or personal network. Our approach is source-backed, structured, and open: every piece of guidance traces back to an official source, and everything we build is public.", + "Clarvia a pour vocation de rendre cet accompagnement plus clair, plus accessible et plus fiable — quelle que soit la langue, la nationalité, les revenus ou le réseau personnel. Notre approche est fondée sur des sources officielles, structurée et ouverte : chaque élément d'orientation renvoie à une source officielle, et tout ce que nous construisons est public.", + "Clarvia hat das Ziel, diese Orientierung klarer, zugänglicher und vertrauenswürdiger zu gestalten — unabhängig von Sprache, Nationalität, Einkommen oder persönlichem Netzwerk. Unser Ansatz ist quellenbasiert, strukturiert und offen: Jeder Orientierungshinweis lässt sich auf eine offizielle Quelle zurückführen, und alles, was wir aufbauen, ist öffentlich zugänglich." + )} +

+
+ +
+ +
+

+ + {l(lang, "Legal name", "Nom légal", "Rechtsname")}: + {" "} + CLARVIA ASBL +

+

+ + {l(lang, "Type", "Type", "Rechtsform")}: + {" "} + {l(lang, + "Non-profit association (ASBL) under Luxembourg law", + "Association sans but lucratif (ASBL) de droit luxembourgeois", + "Gemeinnütziger Verein (ASBL) nach luxemburgischem Recht" + )} +

+

+ + {l(lang, "Registration", "Enregistrement", "Registrierung")}: + {" "} + RCS Luxembourg F15680 +

+

+ + {l(lang, "Address", "Adresse", "Adresse")}: + {" "} + 46, Rue de la Lavande · 1923 Luxembourg +

+

+ + {l(lang, "Founded by", "Fondée par", "Gegründet von")}: + {" "} + Gunther Schriver {l(lang, "and", "et", "und")} Tommi Lindfors +

+

+ + {l(lang, "Founded", "Fondée", "Gegründet")}: + {" "} + {l(lang, "May 2026", "Mai 2026", "Mai 2026")} +

+
+
+ +
+

+ {l(lang, "How it works", "Comment ça fonctionne", "So funktioniert es")} +

+
    + {([ + { + en: "Structured workflow data from official sources", + fr: "Données de workflow structurées à partir de sources officielles", + de: "Strukturierte Workflow-Daten aus offiziellen Quellen", + en_d: "Every administrative step, deadline, and document requirement is extracted directly from official government sources and encoded in a validated, open data model.", + fr_d: "Chaque démarche administrative, délai et exigence documentaire est extrait directement de sources gouvernementales officielles et encodé dans un modèle de données ouvert et validé.", + de_d: "Jeder Verwaltungsschritt, jede Frist und jede Dokumentenanforderung wird direkt aus offiziellen Regierungsquellen entnommen und in einem validierten, offenen Datenmodell erfasst.", + }, + { + en: "Multilingual checklists from verified data", + fr: "Listes de démarches multilingues issues de données vérifiées", + de: "Mehrsprachige Checklisten aus verifizierten Daten", + en_d: "The guidance families receive is generated from verified data, available in English, French, and German to reflect Luxembourg's multilingual reality.", + fr_d: "L'accompagnement fourni aux familles est généré à partir de données vérifiées, disponibles en anglais, français et allemand pour refléter la réalité multilingue du Luxembourg.", + de_d: "Die Orientierung für Familien wird aus verifizierten Daten generiert, verfügbar auf Englisch, Französisch und Deutsch, um der mehrsprachigen Realität Luxemburgs gerecht zu werden.", + }, + { + en: "Open-source infrastructure designed for Europe", + fr: "Infrastructure open source conçue pour l'Europe", + de: "Open-Source-Infrastruktur für Europa", + en_d: "Everything Clarvia builds — the data model, validation logic, and publishing layer — is open source and designed to be reused across European jurisdictions.", + fr_d: "Tout ce que Clarvia construit — le modèle de données, la logique de validation et la couche de publication — est open source et conçu pour être réutilisé dans d'autres juridictions européennes.", + de_d: "Alles, was Clarvia aufbaut — das Datenmodell, die Validierungslogik und die Veröffentlichungsschicht — ist Open Source und für die Wiederverwendung in europäischen Rechtsordnungen konzipiert.", + }, + ] as const).map((item) => ( +
  • +
    +

    + {l(lang, item.en, item.fr, item.de)} +

    +

    + {l(lang, item.en_d, item.fr_d, item.de_d)} +

    +
    +
  • + ))} +
+
+ +
+

+ {l(lang, "Governance and transparency", "Gouvernance et transparence", "Governance und Transparenz")} +

+

+ {l(lang, + "Clarvia operates openly. Our governance standards, contribution guidelines, and source code are all public.", + "Clarvia fonctionne de manière ouverte. Nos normes de gouvernance, nos directives de contribution et notre code source sont tous publics.", + "Clarvia arbeitet transparent. Unsere Governance-Standards, Beitragsrichtlinien und der Quellcode sind alle öffentlich zugänglich." + )} +

+ +
+ +
+ + ); +} diff --git a/src/app/[lang]/sections/FooterSection.tsx b/src/app/[lang]/sections/FooterSection.tsx index b93a593..e0c5d62 100644 --- a/src/app/[lang]/sections/FooterSection.tsx +++ b/src/app/[lang]/sections/FooterSection.tsx @@ -22,6 +22,7 @@ export default function FooterSection({ lang }: { lang: Lang }) {