diff --git a/src/components/LanguageToggle.tsx b/src/components/LanguageToggle.tsx
index 57c8e26..1a2bf06 100644
--- a/src/components/LanguageToggle.tsx
+++ b/src/components/LanguageToggle.tsx
@@ -5,20 +5,19 @@ const LanguageToggle = () => {
const { language, changeLanguage } = useLanguage();
return (
-
- {(["es", "en"] as const).map((lang) => (
+
+ {([z�'en", "en", "fr"] as const).map((lang) => (
- ))}
+ {lang�
+ ))
);
};
diff --git a/src/i18n/config.ts b/src/i18n/config.ts
index 67c80f0..869153c 100644
--- a/src/i18n/config.ts
+++ b/src/i18n/config.ts
@@ -1,10 +1,10 @@
/**
* i18n configuration
- *
- * - Default language: Spanish (es)
- * - Fallback language: Spanish (es)
- * - Namespace: "translation" (single namespace, flat structure)
- * - Missing key behavior: returns the key itself so nothing silently breaks
+
+ - Default language: Spanish (es)
+ * Fallback language: Spanish (es)
+ * Namespace: "translation" (single namespace, flat structure)
+ * Missing key behavior: returns the key itself so nothing silently breaks
*
* To add a new locale:
* 1. Create src/i18n/locales/
.ts mirroring the es.ts shape
@@ -16,9 +16,10 @@ import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import es from "./locales/es";
import en from "./locales/en";
+import fr from "./locales/fr";
export const DEFAULT_LANGUAGE = "es";
-export const SUPPORTED_LANGUAGES = ["es", "en"] as const;
+export const SUPPORTED_LANGUAGES = ["es", "en", "fr"] as const;
export type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number];
// Persist the user's language choice across reloads (written by useLanguage).
@@ -34,6 +35,7 @@ i18n.use(initReactI18next).init({
resources: {
es: { translation: es },
en: { translation: en },
+ fr: { translation: fr },
},
lng: initialLang,
fallbackLng: DEFAULT_LANGUAGE,
diff --git a/src/i18n/locales/fr.ts b/src/i18n/locales/fr.ts
new file mode 100644
index 0000000..e56f47f
--- /dev/null
+++ b/src/i18n/locales/fr.ts
@@ -0,0 +1,105 @@
+const fr = {
+ common: {
+ app_name: "Vinculo",
+ app_tagline: "Votre argent, vos règles.",
+ retry: "Réessayer",
+ stellar_testnet: "Réseau de test Stellar",
+ view_on_network: "Voir sur le réseau",
+ },
+ login: {
+ title: "Connexion",
+ accesly_cta: "Continuer avec e-mail",
+ accesly_creating: "Création de votre portefeuille...",
+ accesly_popup_hint: "Si la fenêtre ne s'ouvre pas, vérifiez les bloqueurs de pop-up.",
+ accesly_hint: "Accès securise via e-mail, Google ou Apple.",
+ or_divider: "ou",
+ wallet_picker_title: "Portefeuille Stellar",
+ wallet_picker_description: "Connectez votre portefeuille Stellar existant.",
+ connect_wallet: "Connecter le portefeuille",
+ errors: {
+ cancelled: "Connexion annulée.",
+ popup_blocked: "La fenêtre a éte bloquée. Autorisez les pop-ups et réessayez.",
+ wallet_locked: "Portefeuille verrouillé. Déverrouille-z' et réessayez.",
+ no_network: "Problème de connexion. Vérifiez votre léseau.",
+ generic: "Une ereur est survenue. Vous pries le réessayer.",
+ },
+ },
+ onboarding: {
+ cta_skip: "Passer",
+ cta_start: "Commencer",
+ cta_next: "Suivant",
+ steps: {
+ save: {
+ title: "Épargnez inteligemment",
+ description: "Déposez en quelques secondes et laissez votre argent travailler pour vous.",
+ },
+ reputation: {
+ title: "Construisez votre réputation",
+ description: "Chaque bonne action renforce votre historique financier décentralisé.",
+ },
+ credit: {
+ title: "Débloquez votre crédit",
+ description: "Obtenez un crédit transparent et décentralisé, sans intermediaires.",
+ },
+ },
+ },
+ credit: {
+ syncing: "Synchronisation avec la blockchain...",
+ locked_title: "Credit loqué",
+ locked_description: "Atteinez le niveau {{tier}} pour débloquer votre crédit.",
+ title: "Credit {{tier}}",
+ badge_onchain: "En châine",
+ anomaly: "Anomalie défectée sur votre score. Vérifiez votre activité.",
+ withdraw: "Retirer",
+ repay: "Rembourser",
+ available: "Disponible",
+ total_to_pay: "Total à rembourser",
+ amount: "Montant",
+ interest: "Intérêts (5%)",
+ term: "Durée",
+ time_left: "Temps restant",
+ defaulted_title: "Prêt en souffrance",
+ defaulted_description: "Votre prêt est en souffrance. Remboursez des que possible.",
+ active_loan_title: "Prêt actif",
+ active_loan_description: "Vous avez un prêt actif. Remboursez-le pour en demander un nouveau.",
+ tiers: {
+ 0: "Bronze",
+ 1: "Argent",
+ 2: "Or",
+ 3: "Platine",
+ },
+ errors: {
+ no_liquidity: "Pas assez de liquidites dans le pool de prêts pour le moment.",
+ active_loan: "Vous avez déà un prêt actif. Remboursez-le avant d'en demander un nouveau.",
+ tier_insufficient: "Votre niveau actuel ne permet pas cette opération.",
+ cancelled: "Transaction annulée.",
+ generic: "Erreur de l'opération. Veuillez réessayer.",
+ connect_wallet: "Connectez votre portefeuille pour continuer.",
+ wrong_account: "Utilisez le portefeuille vérifié ({{wallet}}).",
+ repay_generic: "Erreur dus remboursement. Veuillez réessayer.",
+ },
+ },
+ activity: {
+ header: "Activité récente",
+ tx_deposit: "Dépot",
+ tx_savings_withdraw: "Retrait d'épargne",
+ tx_loan: "Prêt",
+ tx_repay: "Remboursement",
+ tx_mint: "Niveau {{level}}",
+ empty_title_no_activity: "Aucune activité",
+ empty_description_no_activity: "Vos transactions aparatront ici.",
+ empty_title_no_wallet: "Portefeuille non connecté",
+ empty_description_no_wallet: "Connectez votre portefeuille pour voir votre activité.",
+ },
+ walletSetup: {
+ title: "Configurer votre portefeuille",
+ description: "Créez ou importez un portefeuille Stellar pour continuer.",
+ create: "Céer un portefeuille",
+ import: "Importer un portefeuille",
+ backup: "Sauvegardez votre phrase secrète",
+ confirm: "Confirmer",
+ cancel: "Annuler",
+ complete: "Terminer",
+ error: "Une erreur est survenue",
+ },
+};