Mathéo Guilbert EI
-
Développeur Full Stack & Architecte Web
+
{t('me')}
-
Légal
-
Mentions Légales
-
Conditions Générales de Vente
+
{t('legal.title')}
+
{t('legal.legalNotice')}
+
{t('legal.termsAndConditions')}
@@ -32,7 +35,7 @@ export default function Footer() {
-
© 2026 M. Guilbert. Tous droits réservés.
+
{t('copyright')}
);
}
\ No newline at end of file
diff --git a/components/layout/Header.tsx b/components/layout/Header.tsx
index 67faaa9..22335bf 100644
--- a/components/layout/Header.tsx
+++ b/components/layout/Header.tsx
@@ -5,6 +5,7 @@ import React, { useState, useEffect, MouseEvent } from "react";
import { useParams, usePathname } from "next/navigation";
import { CiMenuFries } from "react-icons/ci";
import { IoCloseOutline } from "react-icons/io5";
+import { useTranslations } from "next-intl";
import LanguageSwitcher from "../ui/LanguageSwitcher";
@@ -12,13 +13,14 @@ export default function Header() {
const params = useParams<{ locale?: string }>();
const pathname = usePathname();
const locale = params?.locale ?? "fr";
+ const t = useTranslations('header');
const homePath = `/${locale}`;
const links = [
- { text: "Accueil", target: homePath },
- { text: "Travaux", target: `${homePath}#works` },
- { text: "A propos", target: `${homePath}#about` },
- { text: "Blog", target: `${homePath}/blog` },
+ { text: t('home'), target: homePath },
+ { text: t('works'), target: `${homePath}#works` },
+ { text: t('about'), target: `${homePath}#about` },
+ { text: t('blog'), target: `${homePath}/blog` },
];
const [isOpen, setIsOpen] = useState(false);
diff --git a/components/sections/AboutSection.tsx b/components/sections/AboutSection.tsx
index d20da82..4ff6d24 100644
--- a/components/sections/AboutSection.tsx
+++ b/components/sections/AboutSection.tsx
@@ -1,36 +1,38 @@
'use client';
import { useRef, useEffect, useState } from 'react';
-
-const steps = [
- {
- title: 'Les Débuts',
- text: "J'ai commencé par le web en 2019 suite à un stage, je n'ai plus jamais arrêté. Aujourd'hui je veux en faire mon métier.",
- year: '2019',
- position: 'top' as const,
- left: '16%',
- },
- {
- title: 'L\'Évolution',
- text: "Après un bac STI2D avec mention Très bien j'ai entamé un BUT Informatique Parcours Développement IA.",
- year: '2022',
- position: 'bottom' as const,
- left: '50%',
- },
- {
- title: 'Aujourd\'hui',
- text: "Je suis entrepreneur, co-fondateur d'une startup et développeur freelance, je vis de ma passion.",
- year: '2026',
- position: 'top' as const,
- left: '84%',
- },
-];
-
-const lineTop = '58%';
+import { useTranslations } from "next-intl";
export default function TimelineSection() {
const sectionRef = useRef
(null);
const [visible, setVisible] = useState(false);
+ const t = useTranslations('about');
+
+ const lineTop = '58%';
+
+ const steps = [
+ {
+ title: t('step1.title'),
+ text: t('step1.text'),
+ year: '2019',
+ position: 'top' as const,
+ left: '16%',
+ },
+ {
+ title: t('step2.title'),
+ text: t('step2.text'),
+ year: '2022',
+ position: 'bottom' as const,
+ left: '50%',
+ },
+ {
+ title: t('step3.title'),
+ text: t('step3.text'),
+ year: '2026',
+ position: 'top' as const,
+ left: '84%',
+ },
+ ];
useEffect(() => {
const section = sectionRef.current;
@@ -56,11 +58,11 @@ export default function TimelineSection() {
{/* Label */}
- Parcours
+ {t('sectionLabel')}
- À propos
+ {t('title')}
{/* Mobile layout */}
diff --git a/components/sections/FeatureSection.tsx b/components/sections/AppoachSection.tsx
similarity index 71%
rename from components/sections/FeatureSection.tsx
rename to components/sections/AppoachSection.tsx
index 1fa4197..7c3d8b3 100644
--- a/components/sections/FeatureSection.tsx
+++ b/components/sections/AppoachSection.tsx
@@ -1,28 +1,29 @@
'use client';
import { useRef, useEffect } from 'react';
-import { FeatureColumn } from '@/components/ui/FeatureColumn';
+import { useTranslations } from "next-intl";
-const features = [
- {
- imagePath: '/icons/brain.svg',
- title: 'Plus qu\'un simple exécutant',
- text: 'Grâce à mon background en conception numérique et mobile, je ne me contente pas de coder. J\'apporte un regard critique et constructif sur l\'ensemble de votre projet.',
- },
- {
- imagePath: '/icons/building.svg',
- title: 'Des fondations en béton',
- text: 'Ma spécialité : l\'architecture. Je construis des solutions pérennes, évolutives et capables d\'absorber la croissance de votre produit dans le temps.',
- },
- {
- imagePath: '/icons/people.svg',
- title: 'L\'utilisateur au centre',
- text: 'Le code parfait n\'est rien si le produit ne répond pas à un besoin. Je place l\'expérience utilisateur et la fonctionnalité au cœur de mes développements.',
- },
-];
-
-export default function FeatureSection() {
+export default function ApproachSection() {
const sectionRef = useRef(null);
+ const t = useTranslations('approach');
+
+ const features = [
+ {
+ imagePath: '/icons/brain.svg',
+ title: t('feature1.title'),
+ text: t('feature1.text'),
+ },
+ {
+ imagePath: '/icons/building.svg',
+ title: t('feature2.title'),
+ text: t('feature2.text'),
+ },
+ {
+ imagePath: '/icons/people.svg',
+ title: t('feature3.title'),
+ text: t('feature3.text'),
+ },
+ ];
useEffect(() => {
const section = sectionRef.current;
@@ -51,7 +52,7 @@ export default function FeatureSection() {
{/* Section label */}
- Approche
+ {t('sectionLabel')}
diff --git a/components/sections/HeroSection.tsx b/components/sections/HeroSection.tsx
index 45090f8..b8805ac 100644
--- a/components/sections/HeroSection.tsx
+++ b/components/sections/HeroSection.tsx
@@ -1,9 +1,11 @@
'use client';
import { useEffect, useRef } from 'react';
+import { useTranslations } from "next-intl";
export default function HeroSection() {
const sectionRef = useRef(null);
+ const t = useTranslations('hero');
useEffect(() => {
const section = sectionRef.current;
@@ -36,7 +38,7 @@ export default function HeroSection() {
>
- Développeur Full Stack & Architecte Web
+ {t('sectionLabel')}
@@ -46,9 +48,7 @@ export default function HeroSection() {
style={{ opacity: 0, transform: 'translateY(28px)', transition: 'opacity 700ms cubic-bezier(0.22,1,0.36,1), transform 700ms cubic-bezier(0.22,1,0.36,1)' }}
>
- Ensemble,
- construisons
- ce qui dure.
+ {t('title')}
@@ -58,8 +58,7 @@ export default function HeroSection() {
style={{ opacity: 0, transform: 'translateY(28px)', transition: 'opacity 700ms cubic-bezier(0.22,1,0.36,1), transform 700ms cubic-bezier(0.22,1,0.36,1)' }}
>
- Je conçois des architectures robustes, scalables et pérennes —
- des fondations qui supportent la croissance de votre produit dans le temps.
+ {t('subtitle')}
@@ -77,7 +76,7 @@ export default function HeroSection() {
}}
>