From cd9ad5894e0d421a68e280e225bcbd7a645842d2 Mon Sep 17 00:00:00 2001 From: Antoine Kingue Date: Sun, 28 Dec 2025 07:04:15 +0100 Subject: [PATCH 01/64] =?UTF-8?q?=E2=9C=A8=20add=20translations=20to=20web?= =?UTF-8?q?=20app?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/package.json | 1 + .../{ => [locale]}/(landing)/customer/page.ts | 0 .../app/{ => [locale]}/(landing)/layout.tsx | 0 .../src/app/{ => [locale]}/(landing)/page.ts | 0 .../{ => [locale]}/(legal)/company/page.tsx | 0 .../{ => [locale]}/(legal)/privacy/page.tsx | 0 .../app/{ => [locale]}/(legal)/terms/page.tsx | 0 .../app/{ => [locale]}/[...not_found]/page.ts | 0 .../app/{ => [locale]}/agency/[city]/page.tsx | 0 .../src/app/{ => [locale]}/agency/page.tsx | 0 .../app/{ => [locale]}/careers/[id]/page.tsx | 0 .../src/app/{ => [locale]}/careers/page.tsx | 0 .../src/app/{ => [locale]}/contact/page.tsx | 0 .../glossary/[letter]/[term]/page.tsx | 0 .../{ => [locale]}/glossary/[letter]/page.tsx | 0 .../src/app/{ => [locale]}/glossary/page.tsx | 0 .../glossary/tag/[tag]/page.tsx | 0 .../app/{ => [locale]}/glossary/tags/page.tsx | 0 apps/web/src/app/[locale]/layout.tsx | 106 ++++++++++++++++++ apps/web/src/app/{ => [locale]}/npo/page.tsx | 0 .../app/{ => [locale]}/projects/[id]/page.tsx | 0 .../src/app/{ => [locale]}/projects/page.tsx | 0 apps/web/src/app/[locale]/providers.tsx | 19 ++++ .../services/[category]/[service]/page.tsx | 0 .../services/[category]/page.tsx | 0 .../src/app/{ => [locale]}/services/page.tsx | 0 apps/web/src/app/layout.tsx | 94 ++-------------- .../src/components/layout/footer/footer.tsx | 78 +++++++------ apps/web/src/lib/translations.ts | 23 ++++ apps/web/src/locales/en/footer.json | 25 +++++ apps/web/src/locales/fr/footer.json | 25 +++++ apps/web/src/middleware.ts | 26 +++++ pnpm-lock.yaml | 3 + 33 files changed, 277 insertions(+), 123 deletions(-) rename apps/web/src/app/{ => [locale]}/(landing)/customer/page.ts (100%) rename apps/web/src/app/{ => [locale]}/(landing)/layout.tsx (100%) rename apps/web/src/app/{ => [locale]}/(landing)/page.ts (100%) rename apps/web/src/app/{ => [locale]}/(legal)/company/page.tsx (100%) rename apps/web/src/app/{ => [locale]}/(legal)/privacy/page.tsx (100%) rename apps/web/src/app/{ => [locale]}/(legal)/terms/page.tsx (100%) rename apps/web/src/app/{ => [locale]}/[...not_found]/page.ts (100%) rename apps/web/src/app/{ => [locale]}/agency/[city]/page.tsx (100%) rename apps/web/src/app/{ => [locale]}/agency/page.tsx (100%) rename apps/web/src/app/{ => [locale]}/careers/[id]/page.tsx (100%) rename apps/web/src/app/{ => [locale]}/careers/page.tsx (100%) rename apps/web/src/app/{ => [locale]}/contact/page.tsx (100%) rename apps/web/src/app/{ => [locale]}/glossary/[letter]/[term]/page.tsx (100%) rename apps/web/src/app/{ => [locale]}/glossary/[letter]/page.tsx (100%) rename apps/web/src/app/{ => [locale]}/glossary/page.tsx (100%) rename apps/web/src/app/{ => [locale]}/glossary/tag/[tag]/page.tsx (100%) rename apps/web/src/app/{ => [locale]}/glossary/tags/page.tsx (100%) create mode 100644 apps/web/src/app/[locale]/layout.tsx rename apps/web/src/app/{ => [locale]}/npo/page.tsx (100%) rename apps/web/src/app/{ => [locale]}/projects/[id]/page.tsx (100%) rename apps/web/src/app/{ => [locale]}/projects/page.tsx (100%) create mode 100644 apps/web/src/app/[locale]/providers.tsx rename apps/web/src/app/{ => [locale]}/services/[category]/[service]/page.tsx (100%) rename apps/web/src/app/{ => [locale]}/services/[category]/page.tsx (100%) rename apps/web/src/app/{ => [locale]}/services/page.tsx (100%) create mode 100644 apps/web/src/lib/translations.ts create mode 100644 apps/web/src/locales/en/footer.json create mode 100644 apps/web/src/locales/fr/footer.json create mode 100644 apps/web/src/middleware.ts diff --git a/apps/web/package.json b/apps/web/package.json index 132714d92..63f9b7078 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -11,6 +11,7 @@ }, "dependencies": { "@fontsource/cal-sans": "^5.2.3", + "@onruntime/translations": "workspace:*", "@hookform/resolvers": "^5.0.0", "@mdx-js/loader": "^3.1.0", "@mdx-js/react": "^3.1.0", diff --git a/apps/web/src/app/(landing)/customer/page.ts b/apps/web/src/app/[locale]/(landing)/customer/page.ts similarity index 100% rename from apps/web/src/app/(landing)/customer/page.ts rename to apps/web/src/app/[locale]/(landing)/customer/page.ts diff --git a/apps/web/src/app/(landing)/layout.tsx b/apps/web/src/app/[locale]/(landing)/layout.tsx similarity index 100% rename from apps/web/src/app/(landing)/layout.tsx rename to apps/web/src/app/[locale]/(landing)/layout.tsx diff --git a/apps/web/src/app/(landing)/page.ts b/apps/web/src/app/[locale]/(landing)/page.ts similarity index 100% rename from apps/web/src/app/(landing)/page.ts rename to apps/web/src/app/[locale]/(landing)/page.ts diff --git a/apps/web/src/app/(legal)/company/page.tsx b/apps/web/src/app/[locale]/(legal)/company/page.tsx similarity index 100% rename from apps/web/src/app/(legal)/company/page.tsx rename to apps/web/src/app/[locale]/(legal)/company/page.tsx diff --git a/apps/web/src/app/(legal)/privacy/page.tsx b/apps/web/src/app/[locale]/(legal)/privacy/page.tsx similarity index 100% rename from apps/web/src/app/(legal)/privacy/page.tsx rename to apps/web/src/app/[locale]/(legal)/privacy/page.tsx diff --git a/apps/web/src/app/(legal)/terms/page.tsx b/apps/web/src/app/[locale]/(legal)/terms/page.tsx similarity index 100% rename from apps/web/src/app/(legal)/terms/page.tsx rename to apps/web/src/app/[locale]/(legal)/terms/page.tsx diff --git a/apps/web/src/app/[...not_found]/page.ts b/apps/web/src/app/[locale]/[...not_found]/page.ts similarity index 100% rename from apps/web/src/app/[...not_found]/page.ts rename to apps/web/src/app/[locale]/[...not_found]/page.ts diff --git a/apps/web/src/app/agency/[city]/page.tsx b/apps/web/src/app/[locale]/agency/[city]/page.tsx similarity index 100% rename from apps/web/src/app/agency/[city]/page.tsx rename to apps/web/src/app/[locale]/agency/[city]/page.tsx diff --git a/apps/web/src/app/agency/page.tsx b/apps/web/src/app/[locale]/agency/page.tsx similarity index 100% rename from apps/web/src/app/agency/page.tsx rename to apps/web/src/app/[locale]/agency/page.tsx diff --git a/apps/web/src/app/careers/[id]/page.tsx b/apps/web/src/app/[locale]/careers/[id]/page.tsx similarity index 100% rename from apps/web/src/app/careers/[id]/page.tsx rename to apps/web/src/app/[locale]/careers/[id]/page.tsx diff --git a/apps/web/src/app/careers/page.tsx b/apps/web/src/app/[locale]/careers/page.tsx similarity index 100% rename from apps/web/src/app/careers/page.tsx rename to apps/web/src/app/[locale]/careers/page.tsx diff --git a/apps/web/src/app/contact/page.tsx b/apps/web/src/app/[locale]/contact/page.tsx similarity index 100% rename from apps/web/src/app/contact/page.tsx rename to apps/web/src/app/[locale]/contact/page.tsx diff --git a/apps/web/src/app/glossary/[letter]/[term]/page.tsx b/apps/web/src/app/[locale]/glossary/[letter]/[term]/page.tsx similarity index 100% rename from apps/web/src/app/glossary/[letter]/[term]/page.tsx rename to apps/web/src/app/[locale]/glossary/[letter]/[term]/page.tsx diff --git a/apps/web/src/app/glossary/[letter]/page.tsx b/apps/web/src/app/[locale]/glossary/[letter]/page.tsx similarity index 100% rename from apps/web/src/app/glossary/[letter]/page.tsx rename to apps/web/src/app/[locale]/glossary/[letter]/page.tsx diff --git a/apps/web/src/app/glossary/page.tsx b/apps/web/src/app/[locale]/glossary/page.tsx similarity index 100% rename from apps/web/src/app/glossary/page.tsx rename to apps/web/src/app/[locale]/glossary/page.tsx diff --git a/apps/web/src/app/glossary/tag/[tag]/page.tsx b/apps/web/src/app/[locale]/glossary/tag/[tag]/page.tsx similarity index 100% rename from apps/web/src/app/glossary/tag/[tag]/page.tsx rename to apps/web/src/app/[locale]/glossary/tag/[tag]/page.tsx diff --git a/apps/web/src/app/glossary/tags/page.tsx b/apps/web/src/app/[locale]/glossary/tags/page.tsx similarity index 100% rename from apps/web/src/app/glossary/tags/page.tsx rename to apps/web/src/app/[locale]/glossary/tags/page.tsx diff --git a/apps/web/src/app/[locale]/layout.tsx b/apps/web/src/app/[locale]/layout.tsx new file mode 100644 index 000000000..d0b6db1b0 --- /dev/null +++ b/apps/web/src/app/[locale]/layout.tsx @@ -0,0 +1,106 @@ +import "reflect-metadata"; +import "@fontsource/cal-sans"; +import "@/styles/reset.css"; +import "@/styles/globals.css"; + +import type { ReactNode } from "react"; +import Script from "next/script"; +import { Figtree } from "next/font/google"; +import { Provider } from "react-wrap-balancer"; + +import { cn } from "@/lib/utils/cn"; +import { locales } from "@/lib/translations"; +import Navbar from "@/components/marketing/navbar"; +import Footer from "@/components/layout/footer/footer"; +import { Toaster } from "@/components/ui/toaster"; +import { OrganizationSchema } from "@/components/json-ld/organization-schema"; + +import { Providers } from "./providers"; + +export const figtree = Figtree({ + subsets: ["latin"], + variable: "--font-figtree", +}); + +export async function generateStaticParams() { + return locales.map((locale) => ({ locale })); +} + +type LayoutProps = { + children: ReactNode; + params: Promise<{ locale: string }>; +}; + +export default async function LocaleLayout({ children, params }: LayoutProps) { + const { locale } = await params; + + return ( + + + + + + + + + {children} + +