Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 7 additions & 8 deletions src/components/LanguageToggle.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,19 @@ const LanguageToggle = () => {
const { language, changeLanguage } = useLanguage();

return (
<div className="flex items-center gap-0.5 bg-secondary rounded-full p-0.5 text-[11px] font-bold">
{(["es", "en"] as const).map((lang) => (
<div className="flex items-center gap-0.5 bg-secondary rounded-full p0.5 text-[11px] font-bold">
{([z�'en", "en", "fr"] as const).map((lang) => (
<button
key={lang}
onClick={() => changeLanguage(lang)}
className={`px-2.5 py-1 rounded-full uppercase tracking-wide transition-colors ${
className={`px-2.5 py-1 rounded-full uppercase tracking-wide transition-colors${
language === lang
? "bg-primary text-primary-foreground"
: "text-muted-foreground hover:text-foreground"
}`}
: "text-muted-foreground hover-text-foreground"
}`"}
>
{lang}
</button>
))}
{lang� </button>
))
</div>
);
};
Expand Down
14 changes: 8 additions & 6 deletions src/i18n/config.ts
Original file line number Diff line number Diff line change
@@ -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/<lang>.ts mirroring the es.ts shape
Expand All @@ -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).
Expand All @@ -34,6 +35,7 @@ i18n.use(initReactI18next).init({
resources: {
es: { translation: es },
en: { translation: en },
fr: { translation: fr },
},
lng: initialLang,
fallbackLng: DEFAULT_LANGUAGE,
Expand Down
105 changes: 105 additions & 0 deletions src/i18n/locales/fr.ts
Original file line number Diff line number Diff line change
@@ -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",
},
};