feat: translate all UI strings to English for international release

Complete French→English translation across all frontend pages and backend
services — every label, button, header, empty state, toast, and nav item
is now in English. Build verified clean (tsc + vite). No i18n library
added; direct string replacement throughout.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
OpenSquared
2026-06-22 09:06:37 +02:00
parent f8a0a6d023
commit dcbc9f19fc
24 changed files with 1443 additions and 1444 deletions

View File

@@ -8,11 +8,11 @@ import { TrendingUp, TrendingDown, BarChart2, RefreshCw, Search } from 'lucide-r
const ASSET_CLASSES: { key: AssetClass; label: string; emoji: string }[] = [
{ key: 'energy', label: 'Énergie', emoji: '⛽' },
{ key: 'metals', label: 'Métaux', emoji: '🥇' },
{ key: 'energy', label: 'Energy', emoji: '⛽' },
{ key: 'metals', label: 'Metals', emoji: '🥇' },
{ key: 'agriculture', label: 'Agriculture', emoji: '🌾' },
{ key: 'indices', label: 'Indices', emoji: '📊' },
{ key: 'equities', label: 'Actions', emoji: '📈' },
{ key: 'equities', label: 'Equities', emoji: '📈' },
{ key: 'forex', label: 'Forex', emoji: '💱' },
]
@@ -56,8 +56,8 @@ const PERIOD_OPTIONS = [
{ label: '1M', value: '1mo' },
{ label: '3M', value: '3mo' },
{ label: '6M', value: '6mo' },
{ label: '1A', value: '1y' },
{ label: '2A', value: '2y' },
{ label: '1Y', value: '1y' },
{ label: '2Y', value: '2y' },
]
function PriceChart({ symbol, name }: { symbol: string; name: string }) {
@@ -127,7 +127,7 @@ function PriceChart({ symbol, name }: { symbol: string; name: string }) {
<Tooltip
contentStyle={{ background: '#0f1623', border: '1px solid #1e2d4d', fontSize: 11 }}
labelStyle={{ color: '#94a3b8' }}
formatter={(v: number) => [v.toFixed(4), 'Prix']}
formatter={(v: number) => [v.toFixed(4), 'Price']}
/>
<Area
type="monotone" dataKey="close"
@@ -139,7 +139,7 @@ function PriceChart({ symbol, name }: { symbol: string; name: string }) {
</ResponsiveContainer>
) : (
<div className="h-48 flex items-center justify-center text-slate-600 text-xs">
Aucune donnée disponible
No data available
</div>
)}
</div>
@@ -192,17 +192,17 @@ export default function Markets() {
<div className="flex items-center justify-between">
<div>
<h1 className="text-xl font-bold text-white flex items-center gap-2">
<BarChart2 className="w-5 h-5 text-blue-400" /> Marchés & Prix
<BarChart2 className="w-5 h-5 text-blue-400" /> Markets & Prices
</h1>
<p className="text-xs text-slate-500 mt-0.5">
Données en temps réel · Volatilité implicite · Opportunités options
Real-time data · Implied volatility · Options opportunities
</p>
</div>
<button
onClick={() => refetch()}
className="flex items-center gap-1.5 text-xs text-slate-400 hover:text-slate-200 transition-colors"
>
<RefreshCw className="w-3.5 h-3.5" /> Actualiser
<RefreshCw className="w-3.5 h-3.5" /> Refresh
</button>
</div>
@@ -227,7 +227,7 @@ export default function Markets() {
value={searchQuery}
onChange={e => setSearchQuery(e.target.value)}
onKeyDown={e => { if (e.key === 'Escape') setSearchQuery('') }}
placeholder="Rechercher un ticker..."
placeholder="Search ticker..."
className="bg-dark-700 border border-slate-700 rounded pl-8 pr-3 py-1.5 text-sm text-white placeholder-slate-600 focus:outline-none focus:border-blue-500 w-52"
/>
{searchResults.length > 0 && (
@@ -282,7 +282,7 @@ export default function Markets() {
))
) : (
<div className="card text-slate-500 text-xs text-center py-6">
Démarrer le backend pour charger les prix
Start the backend to load prices
</div>
)}
</div>
@@ -295,8 +295,8 @@ export default function Markets() {
<div className="card h-full flex items-center justify-center text-slate-600 text-sm">
<div className="text-center">
<BarChart2 className="w-8 h-8 mx-auto mb-2 opacity-30" />
<div>Sélectionner un instrument</div>
<div className="text-xs mt-1">pour voir le graphique de prix</div>
<div>Select an instrument</div>
<div className="text-xs mt-1">to view the price chart</div>
</div>
</div>
)}
@@ -305,16 +305,16 @@ export default function Markets() {
{/* Market overview table */}
<div className="card">
<div className="section-title">Vue d'ensemble — Tous marchés</div>
<div className="section-title">Overview All Markets</div>
<div className="overflow-x-auto">
<table className="w-full text-xs">
<thead>
<tr className="text-slate-600 border-b border-slate-700/40">
<th className="text-left pb-2">Instrument</th>
<th className="text-left pb-2">Classe</th>
<th className="text-right pb-2">Prix</th>
<th className="text-right pb-2">Var. 1j</th>
<th className="text-right pb-2">Vol. IV (est.)</th>
<th className="text-left pb-2">Class</th>
<th className="text-right pb-2">Price</th>
<th className="text-right pb-2">1d Chg</th>
<th className="text-right pb-2">IV Vol (est.)</th>
<th className="text-right pb-2">Signal</th>
</tr>
</thead>
@@ -337,9 +337,9 @@ export default function Markets() {
{q.iv ? `${(q.iv * 100).toFixed(1)}%` : '—'}
</td>
<td className="py-1.5 text-right">
{q.change_pct > 1.5 ? <span className="badge-green badge"> Haussier</span>
: q.change_pct < -1.5 ? <span className="badge-red badge"> Baissier</span>
: <span className="badge badge-blue"> Neutre</span>}
{q.change_pct > 1.5 ? <span className="badge-green badge"> Bullish</span>
: q.change_pct < -1.5 ? <span className="badge-red badge"> Bearish</span>
: <span className="badge badge-blue"> Neutral</span>}
</td>
</tr>
))