Skip to content

Commit 7706b16

Browse files
Translate the entire project
Translate all text content to support multiple languages, defaulting to English and supporting French, Spanish, Russian, and Chinese based on browser language settings.
1 parent cf1741c commit 7706b16

File tree

10 files changed

+489
-55
lines changed

10 files changed

+489
-55
lines changed

src/components/landing/CTASection.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11

22
import { Button } from "@/components/ui/button";
33
import { ArrowRight, Clock } from "lucide-react";
4+
import { useTranslation } from 'react-i18next';
45

56
interface CTASectionProps {
67
onRedirectToDashboard: () => void;
78
}
89

910
export const CTASection = ({ onRedirectToDashboard }: CTASectionProps) => {
11+
const { t } = useTranslation();
12+
1013
return (
1114
<section className="py-24 px-4 sm:px-6 lg:px-8 bg-gradient-to-r from-blue-600 via-purple-600 to-blue-800 relative overflow-hidden">
1215
<div className="absolute inset-0 bg-black/10"></div>
@@ -15,11 +18,10 @@ export const CTASection = ({ onRedirectToDashboard }: CTASectionProps) => {
1518
<Clock className="w-16 h-16 text-blue-200 mx-auto mb-4 animate-pulse" />
1619
</div>
1720
<h2 className="text-4xl md:text-6xl font-bold text-white mb-6">
18-
Your competition is already here
21+
{t('cta.title')}
1922
</h2>
2023
<p className="text-xl text-blue-100 mb-8 max-w-2xl mx-auto leading-relaxed">
21-
While others pay monthly fees for uncertain results, smart companies are already earning with RefSpring's
22-
performance-based model. Don't let them get ahead.
24+
{t('cta.subtitle')}
2325
</p>
2426
<div className="flex flex-col sm:flex-row gap-6 justify-center">
2527
<Button
@@ -28,7 +30,7 @@ export const CTASection = ({ onRedirectToDashboard }: CTASectionProps) => {
2830
className="text-lg px-12 py-6 bg-white text-slate-900 hover:bg-slate-100 hover:scale-105 transition-all shadow-xl"
2931
onClick={onRedirectToDashboard}
3032
>
31-
Start earning now
33+
{t('cta.startEarning')}
3234
<ArrowRight className="ml-2 h-5 w-5" />
3335
</Button>
3436
<Button
@@ -37,7 +39,7 @@ export const CTASection = ({ onRedirectToDashboard }: CTASectionProps) => {
3739
className="text-lg px-12 py-6 border-2 border-white text-white hover:bg-white hover:text-slate-900 hover:scale-105 transition-all"
3840
onClick={onRedirectToDashboard}
3941
>
40-
See live demo
42+
{t('cta.seeDemo')}
4143
</Button>
4244
</div>
4345
</div>

src/components/landing/FeaturesSection.tsx

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,34 @@
11

22
import { Zap, Users, BarChart3, Shield } from "lucide-react";
3+
import { useTranslation } from 'react-i18next';
34

45
export const FeaturesSection = () => {
6+
const { t } = useTranslation();
7+
58
const features = [
69
{
710
icon: <Zap className="h-10 w-10 text-blue-600" />,
8-
title: "Lightning Fast",
9-
description: "Set up your affiliate program in minutes, not weeks. One-click deployment.",
10-
metric: "3 min setup"
11+
title: t('features.lightningFast.title'),
12+
description: t('features.lightningFast.description'),
13+
metric: t('features.lightningFast.metric')
1114
},
1215
{
1316
icon: <Users className="h-10 w-10 text-green-600" />,
14-
title: "Smart Recruitment",
15-
description: "AI-powered affiliate matching. Find and onboard top performers automatically.",
16-
metric: "847 affiliates"
17+
title: t('features.smartRecruitment.title'),
18+
description: t('features.smartRecruitment.description'),
19+
metric: t('features.smartRecruitment.metric')
1720
},
1821
{
1922
icon: <BarChart3 className="h-10 w-10 text-purple-600" />,
20-
title: "Real-time Analytics",
21-
description: "Track performance with crystal-clear insights. Know what's working instantly.",
22-
metric: "Live tracking"
23+
title: t('features.realTimeAnalytics.title'),
24+
description: t('features.realTimeAnalytics.description'),
25+
metric: t('features.realTimeAnalytics.metric')
2326
},
2427
{
2528
icon: <Shield className="h-10 w-10 text-orange-600" />,
26-
title: "Fraud Protection",
27-
description: "Advanced AI security to protect against fraudulent activities and fake traffic.",
28-
metric: "99.9% accuracy"
29+
title: t('features.fraudProtection.title'),
30+
description: t('features.fraudProtection.description'),
31+
metric: t('features.fraudProtection.metric')
2932
}
3033
];
3134

@@ -34,10 +37,10 @@ export const FeaturesSection = () => {
3437
<div className="max-w-7xl mx-auto">
3538
<div className="text-center mb-16">
3639
<h2 className="text-4xl md:text-5xl font-bold text-slate-900 mb-6">
37-
Everything you need to dominate
40+
{t('features.title')}
3841
</h2>
3942
<p className="text-xl text-slate-600 max-w-2xl mx-auto">
40-
Powerful tools designed to help you build and manage successful affiliate programs at scale.
43+
{t('features.subtitle')}
4144
</p>
4245
</div>
4346

src/components/landing/HeroSection.tsx

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11

22
import { Button } from "@/components/ui/button";
33
import { ArrowRight, CheckCircle, Star, DollarSign, TrendingUp, Zap, Globe } from "lucide-react";
4+
import { useTranslation } from 'react-i18next';
45

56
interface HeroSectionProps {
67
scrollY: number;
78
onRedirectToDashboard: () => void;
89
}
910

1011
export const HeroSection = ({ scrollY, onRedirectToDashboard }: HeroSectionProps) => {
12+
const { t } = useTranslation();
13+
1114
return (
1215
<section className="h-screen flex items-center justify-center bg-gradient-to-br from-blue-50/50 via-white to-purple-50/50 relative">
1316
{/* Grid Pattern Background */}
@@ -38,37 +41,37 @@ export const HeroSection = ({ scrollY, onRedirectToDashboard }: HeroSectionProps
3841
{/* Badge */}
3942
<div className="inline-flex items-center gap-2 bg-gradient-to-r from-blue-100 to-purple-100 text-blue-800 px-6 py-3 rounded-full text-sm font-medium border border-blue-200/50 backdrop-blur-sm animate-scale-in">
4043
<CheckCircle className="w-4 h-4" />
41-
0€ de frais mensuels • Rémunération sur performance uniquement
44+
{t('hero.badge')}
4245
<Star className="w-4 h-4 text-yellow-500" />
4346
</div>
4447

4548
<h1 className="text-5xl md:text-7xl lg:text-8xl font-bold text-slate-900 leading-tight">
46-
Enfin une plateforme
49+
{t('hero.title.part1')}
4750
<br />
4851
<span className="bg-gradient-to-r from-blue-600 via-purple-600 to-blue-800 bg-clip-text text-transparent animate-pulse">
49-
qui paie pour elle-même
52+
{t('hero.title.part2')}
5053
</span>
5154
</h1>
5255

5356
<p className="text-lg md:text-xl lg:text-2xl text-slate-600 max-w-4xl mx-auto leading-relaxed" style={{ animationDelay: '0.2s' }}>
54-
<strong>Modèle basé sur les revenus :</strong>
57+
<strong>{t('hero.subtitle.bold')}</strong>
5558
<br />
56-
<span className="text-slate-900 font-semibold">Accès gratuit, nous gagnons seulement quand vous gagnez.</span>
59+
<span className="text-slate-900 font-semibold">{t('hero.subtitle.normal')}</span>
5760
</p>
5861

5962
{/* Value props with animations */}
6063
<div className="flex flex-wrap justify-center gap-4 lg:gap-6">
6164
{[
62-
{ icon: CheckCircle, text: "0€ de frais d'installation", delay: "0.3s" },
63-
{ icon: CheckCircle, text: "0€ d'abonnement mensuel", delay: "0.4s" },
64-
{ icon: CheckCircle, text: "Accès complet à la plateforme", delay: "0.5s" }
65+
{ text: t('hero.features.noSetupFee'), delay: "0.3s" },
66+
{ text: t('hero.features.noMonthlyFee'), delay: "0.4s" },
67+
{ text: t('hero.features.fullAccess'), delay: "0.5s" }
6568
].map((item, index) => (
6669
<div
6770
key={index}
6871
className="flex items-center gap-2 bg-white/80 backdrop-blur-sm px-4 py-2 lg:px-6 lg:py-3 rounded-full border border-slate-200 hover:scale-105 transition-all animate-fade-in shadow-lg"
6972
style={{ animationDelay: item.delay }}
7073
>
71-
<item.icon className="w-4 h-4 lg:w-5 lg:h-5 text-green-600" />
74+
<CheckCircle className="w-4 h-4 lg:w-5 lg:h-5 text-green-600" />
7275
<span className="text-sm lg:text-base text-slate-700 font-medium">{item.text}</span>
7376
</div>
7477
))}
@@ -80,7 +83,7 @@ export const HeroSection = ({ scrollY, onRedirectToDashboard }: HeroSectionProps
8083
className="text-lg px-8 py-4 lg:px-12 lg:py-6 bg-gradient-to-r from-blue-600 to-purple-600 hover:from-blue-700 hover:to-purple-700 shadow-2xl hover:shadow-3xl transition-all hover:scale-105 border-0 text-white"
8184
onClick={onRedirectToDashboard}
8285
>
83-
Commencer à gagner dès aujourd'hui
86+
{t('hero.cta.primary')}
8487
<ArrowRight className="ml-2 h-5 w-5" />
8588
</Button>
8689
<Button
@@ -89,21 +92,21 @@ export const HeroSection = ({ scrollY, onRedirectToDashboard }: HeroSectionProps
8992
className="text-lg px-8 py-4 lg:px-12 lg:py-6 border-2 hover:bg-slate-50 shadow-lg hover:scale-105 transition-all backdrop-blur-sm"
9093
onClick={onRedirectToDashboard}
9194
>
92-
Voir comment ça marche
95+
{t('hero.cta.secondary')}
9396
</Button>
9497
</div>
9598

9699
{/* Social proof with animation */}
97100
<div className="pt-12 border-t border-slate-200/50" style={{ animationDelay: '0.8s' }}>
98-
<p className="text-slate-500 text-sm mb-6">Adopté par les entreprises qui veulent des résultats, pas des factures récurrentes</p>
101+
<p className="text-slate-500 text-sm mb-6">{t('hero.socialProof.text')}</p>
99102
<div className="flex justify-center items-center gap-6 lg:gap-8 opacity-70">
100-
<div className="text-2xl lg:text-3xl font-bold text-slate-600 hover:text-blue-600 transition-colors">50M€+</div>
103+
<div className="text-2xl lg:text-3xl font-bold text-slate-600 hover:text-blue-600 transition-colors">{t('hero.socialProof.revenue')}</div>
101104
<div className="w-px h-6 lg:h-8 bg-slate-300"></div>
102-
<div className="text-base lg:text-lg font-medium text-slate-500">Générés</div>
105+
<div className="text-base lg:text-lg font-medium text-slate-500">{t('hero.socialProof.generated')}</div>
103106
<div className="w-px h-6 lg:h-8 bg-slate-300"></div>
104-
<div className="text-2xl lg:text-3xl font-bold text-green-600">0€</div>
107+
<div className="text-2xl lg:text-3xl font-bold text-green-600">{t('hero.socialProof.upfront')}</div>
105108
<div className="w-px h-6 lg:h-8 bg-slate-300"></div>
106-
<div className="text-base lg:text-lg font-medium text-slate-500">D'avance</div>
109+
<div className="text-base lg:text-lg font-medium text-slate-500">{t('hero.socialProof.advance')}</div>
107110
</div>
108111
</div>
109112
</div>

src/components/landing/StatsSection.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,26 @@
11

22
import { Globe, TrendingUp, Shield, Award } from "lucide-react";
3+
import { useTranslation } from 'react-i18next';
34

45
export const StatsSection = () => {
6+
const { t } = useTranslation();
7+
58
const stats = [
6-
{ number: "10K+", label: "Active Campaigns", icon: <Globe className="w-8 h-8" /> },
7-
{ number: "€50M+", label: "Revenue Generated", icon: <TrendingUp className="w-8 h-8" /> },
8-
{ number: "99.9%", label: "Uptime", icon: <Shield className="w-8 h-8" /> },
9-
{ number: "€0", label: "Upfront Costs", icon: <Award className="w-8 h-8" /> }
9+
{ number: "10K+", label: t('stats.activeCampaigns'), icon: <Globe className="w-8 h-8" /> },
10+
{ number: "€50M+", label: t('stats.revenueGenerated'), icon: <TrendingUp className="w-8 h-8" /> },
11+
{ number: "99.9%", label: t('stats.uptime'), icon: <Shield className="w-8 h-8" /> },
12+
{ number: "€0", label: t('stats.upfrontCosts'), icon: <Award className="w-8 h-8" /> }
1013
];
1114

1215
return (
1316
<section className="py-24 px-4 sm:px-6 lg:px-8 bg-slate-900 relative overflow-hidden">
1417
<div className="absolute inset-0 bg-gradient-to-r from-blue-900/20 to-purple-900/20"></div>
1518
<div className="max-w-7xl mx-auto text-center relative z-10">
1619
<h2 className="text-4xl font-bold text-white mb-4">
17-
Numbers that speak louder than words
20+
{t('stats.title')}
1821
</h2>
1922
<p className="text-xl text-slate-300 mb-16 max-w-2xl mx-auto">
20-
Join the revolution of performance-based affiliate marketing.
23+
{t('stats.subtitle')}
2124
</p>
2225
<div className="grid md:grid-cols-4 gap-8">
2326
{stats.map((stat, index) => (

src/components/landing/StorySection.tsx

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,41 @@
11

2+
import { useTranslation } from 'react-i18next';
3+
24
export const StorySection = () => {
5+
const { t } = useTranslation();
6+
37
return (
48
<section className="py-24 px-4 sm:px-6 lg:px-8 bg-gradient-to-b from-white to-slate-50">
59
<div className="max-w-6xl mx-auto">
610
<div className="text-center mb-16">
711
<h2 className="text-4xl md:text-5xl font-bold text-slate-900 mb-6">
8-
L'histoire qui change tout
12+
{t('story.title')}
913
</h2>
1014
<p className="text-xl text-slate-600 max-w-3xl mx-auto leading-relaxed">
11-
Pendant que d'autres plateformes demandent 299€/mois d'avance avant que vous gagniez un seul euro,
12-
nous croyons en une approche différente : <strong>votre succès est notre succès.</strong>
15+
{t('story.subtitle.part1')} <strong>{t('story.subtitle.bold')}</strong>
1316
</p>
1417
</div>
1518

1619
<div className="grid md:grid-cols-3 gap-8 mb-16">
1720
{[
1821
{
1922
step: "01",
20-
title: "Plateformes traditionnelles",
21-
description: "Payez 99-299€/mois, espérez le meilleur, priez pour couvrir vos coûts",
23+
title: t('story.steps.traditional.title'),
24+
description: t('story.steps.traditional.description'),
2225
icon: "❌",
2326
color: "red"
2427
},
2528
{
2629
step: "02",
27-
title: "La méthode RefSpring",
28-
description: "Commencez immédiatement, accès complet, nous gagnons seulement quand vous gagnez. Zéro risque.",
30+
title: t('story.steps.refspring.title'),
31+
description: t('story.steps.refspring.description'),
2932
icon: "✅",
3033
color: "green"
3134
},
3235
{
3336
step: "03",
34-
title: "Votre résultat",
35-
description: "Concentrez-vous sur votre croissance, pas sur les factures mensuelles. Chaque euro gagné est du profit pur.",
37+
title: t('story.steps.result.title'),
38+
description: t('story.steps.result.description'),
3639
icon: "🚀",
3740
color: "blue"
3841
}

src/i18n/locales/en.json

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,90 @@
6060
"actionsPerformed": "Actions performed",
6161
"grossRevenue": "Gross revenue",
6262
"costPerAcquisition": "Cost per acquisition",
63-
"returnOnAdSpend": "Return on ad spend"
63+
"returnOnAdSpend": "Return on ad spend",
64+
"title": "Numbers that speak louder than words",
65+
"subtitle": "Join the revolution of performance-based affiliate marketing.",
66+
"activeCampaigns": "Active Campaigns",
67+
"revenueGenerated": "Revenue Generated",
68+
"uptime": "Uptime",
69+
"upfrontCosts": "Upfront Costs"
70+
},
71+
"hero": {
72+
"badge": "€0 monthly fees • Performance-based compensation only",
73+
"title": {
74+
"part1": "Finally a platform",
75+
"part2": "that pays for itself"
76+
},
77+
"subtitle": {
78+
"bold": "Revenue-based model:",
79+
"normal": "Free access, we only earn when you earn."
80+
},
81+
"features": {
82+
"noSetupFee": "€0 setup fee",
83+
"noMonthlyFee": "€0 monthly subscription",
84+
"fullAccess": "Full platform access"
85+
},
86+
"cta": {
87+
"primary": "Start earning today",
88+
"secondary": "See how it works"
89+
},
90+
"socialProof": {
91+
"text": "Adopted by companies that want results, not recurring bills",
92+
"revenue": "50M€+",
93+
"generated": "Generated",
94+
"upfront": "€0",
95+
"advance": "Upfront"
96+
}
97+
},
98+
"story": {
99+
"title": "The story that changes everything",
100+
"subtitle": {
101+
"part1": "While other platforms ask for €299/month upfront before you earn a single euro, we believe in a different approach:",
102+
"bold": "your success is our success."
103+
},
104+
"steps": {
105+
"traditional": {
106+
"title": "Traditional platforms",
107+
"description": "Pay €99-299/month, hope for the best, pray to cover your costs"
108+
},
109+
"refspring": {
110+
"title": "The RefSpring method",
111+
"description": "Start immediately, full access, we only earn when you earn. Zero risk."
112+
},
113+
"result": {
114+
"title": "Your result",
115+
"description": "Focus on your growth, not on monthly bills. Every euro earned is pure profit."
116+
}
117+
}
118+
},
119+
"features": {
120+
"title": "Everything you need to dominate",
121+
"subtitle": "Powerful tools designed to help you build and manage successful affiliate programs at scale.",
122+
"lightningFast": {
123+
"title": "Lightning Fast",
124+
"description": "Set up your affiliate program in minutes, not weeks. One-click deployment.",
125+
"metric": "3 min setup"
126+
},
127+
"smartRecruitment": {
128+
"title": "Smart Recruitment",
129+
"description": "AI-powered affiliate matching. Find and onboard top performers automatically.",
130+
"metric": "847 affiliates"
131+
},
132+
"realTimeAnalytics": {
133+
"title": "Real-time Analytics",
134+
"description": "Track performance with crystal-clear insights. Know what's working instantly.",
135+
"metric": "Live tracking"
136+
},
137+
"fraudProtection": {
138+
"title": "Fraud Protection",
139+
"description": "Advanced AI security to protect against fraudulent activities and fake traffic.",
140+
"metric": "99.9% accuracy"
141+
}
142+
},
143+
"cta": {
144+
"title": "Your competition is already here",
145+
"subtitle": "While others pay monthly fees for uncertain results, smart companies are already earning with RefSpring's performance-based model. Don't let them get ahead.",
146+
"startEarning": "Start earning now",
147+
"seeDemo": "See live demo"
64148
}
65149
}

0 commit comments

Comments
 (0)