Date: February 6, 2026 Status: Complete Scope: All user-visible text translated from French to English
Complete translation of the SmartFolio UI from French to English across ~50 files, ~300+ individual string translations. The project is now English-first for all user-facing content.
- UI labels, buttons, headings, subheadings
- Error messages (
showNotification,showError,showToast,confirm,alert) - ARIA labels and
titleattributes (accessibility/tooltips) - Placeholder text in forms
- Pydantic
Field(description=...)strings (OpenAPI docs) HTTPException(detail=...)messages- Config/preset display names
- Chart labels, axis titles, dataset names
- Loading states, empty states
- Date/number locale:
fr-FR→en-US
- Code comments (
//,/* */,<!-- -->) - Log messages (
console.log,debugLogger,logger.info) - Internal variable/function names
- Developer documentation (CLAUDE.md)
- JSDoc comments
- File names (e.g.,
bourse-analytics.htmlstays as-is)
Models (models/wealth.py):
PatrimoineItemInput→WealthItemInput(backward compat alias kept)PatrimoineItemOutput→WealthItemOutput(backward compat alias kept)
Services:
services/wealth/patrimoine_service.py→wealth_service.pyservices/wealth/patrimoine_migration.py→wealth_migration.py
API Routes (api/wealth_endpoints.py):
| Old Route | New Route |
|---|---|
/api/wealth/patrimoine/items |
/api/wealth/items |
/api/wealth/patrimoine/items/{id} |
/api/wealth/items/{id} |
/api/wealth/patrimoine/summary |
/api/wealth/summary |
Legacy /patrimoine/ routes still work (redirect for backward compat).
Data Storage:
- Primary:
data/users/{user_id}/wealth/wealth.json - Fallback:
data/users/{user_id}/wealth/patrimoine.json - Migration script:
scripts/migrate_patrimoine_to_wealth.py
- ~50
HTTPException(detail="...")messages translated across ~15 API files - ~232
Field(description="...")strings translated across ~23 model/endpoint files
HTML Pages (~25 pages):
<html lang="fr">→<html lang="en">on all pages- Page titles, h1/h2/h3 headings
- Button labels, loading states, empty states
- Metric labels, chart titles
- Form labels, placeholders
JavaScript Modules (~30 files):
showNotification(),showError(),showToast()messagesconfirm()andalert()dialog text- Chart.js labels and dataset names
- Status bar messages (
setStatus()) - Dynamic template literals
- Score interpretation strings (risk dashboard, decision index)
Key translations:
| French | English |
|---|---|
| Bourse | Stocks / Stock Market |
| Patrimoine | Wealth |
| Outils | Tools |
| Chargement... | Loading... |
| Aucun(e)... | No... |
| Erreur | Error |
| Actualiser | Refresh |
| Veuillez... | Please... |
| Données | Data |
| Disponible | Available |
| En cours | In progress |
| Enregistrer | Save |
| Supprimer | Delete |
| Annuler | Cancel |
| Fermer | Close |
| Proportionnel | Proportional |
| Faible | Low |
| Bon | Good |
| Neutre | Neutral |
| Euphorie | Euphoria |
| 30j / 90j / 365j | 30d / 90d / 365d |
config/strategy_templates.json- 5 strategy descriptionsstatic/presets/sim_presets.json- ~30 name/description/tooltip stringsstatic/presets/cycle_phase_presets.json- 1 noteconfig/users.json- Display names
services/sources/bourse/saxobank_csv.py:
- Added bilingual header mapping (FR ↔ EN)
- Parser normalizes headers before processing → accepts both FR and EN CSV exports
models/wealth.pyservices/wealth/wealth_service.py,wealth_migration.pyapi/wealth_endpoints.pyapi/advanced_rebalancing_endpoints.pyapi/strategy_endpoints.pyapi/sources_endpoints.pyapi/rebalancing_strategy_router.pyapi/csv_endpoints.pyapi/taxonomy_endpoints.pyapi/di_backtest_endpoints.pyservices/execution/governance.pyconfig/settings.pyservices/sources/bourse/saxobank_csv.py
analytics-unified.html,advanced-risk.html,ai-dashboard.htmlalias-manager.html,admin-dashboard.htmlbourse-analytics.html,bourse-recommendations.htmlcycle-analysis.html,dashboard.html,di-backtest.htmlexecution.html,execution_history.htmlmonitoring.html,optimization.htmlperformance-monitor-unified.htmlportfolio-optimization-advanced.htmlrebalance.html,risk-dashboard.htmlsaxo-dashboard.html,settings.htmlsimulations.html,wealth-dashboard.html
components/:nav.js,decision-index-panel.js,GovernancePanel.js,WealthContextBar.js,ai-chat.js,SimControls.js,SimInspector.js,flyout-panel.js,risk-snapshot.js,risk-sidebar-full.js,UnifiedInsights.js,manual-source-editor.js,page-anchors-setup.js,domain-nav.js,ai-chat-context-builders.jsmodules/:dashboard-main-controller.js,rebalance-controller.js,risk-dashboard-main-controller.js,risk-overview-tab.js,risk-cycles-tab.js,risk-targets-tab.js,risk-dashboard-alerts-controller.js,settings-main-controller.js,settings-sources-utils.js,portfolio-optimization-logic.js,market-regimes.js,onchain-indicators.js,indicator-categories-v2.js,composite-score-v2.js,equities-utils.js,wealth-saxo-summary.js,analytics-unified-tabs-controller.js- Root:
sources-manager-v2.js,analytics-unified.js,input-validator.js,performance-optimizer.js
config/strategy_templates.jsonstatic/presets/sim_presets.jsonstatic/presets/cycle_phase_presets.jsonconfig/users.json
docs/WEALTH_MODULE.md(new, replaces PATRIMOINE_MODULE.md)CLAUDE.md(updated references)CHANGELOG.md(added migration entry)
Section 5: English-Only UI — enforces English for all new user-visible text going forward.
See CLAUDE.md section 5 for the full rule.
Residual French text was verified via comprehensive grep sweeps. All remaining French is exclusively in:
- Code comments (
//,/* */,<!-- -->) - Debug/log messages (
console.log,debugLogger,logger.info) - JSDoc comments
- HTML comments
- Developer documentation
No user-visible French text remains in the codebase.