Skip to main content

Sélection de la langue

Ordre de détection : préfixe URL → Cookie → Langue de base (anglais)

Langue actuelle: Français (fr)
Formatting locale: fr-FR

Messages traduits

m.greeting({ name: 'World' }) Bonjour, World !
m.welcome_message() Bienvenue dans la démonstration d'internationalisation
m.sample_text() Ce texte est traduit en fonction de la langue actuelle.

Pluralisation

ICU MessageFormat handles pluralization rules per language.

m.items_count({ count: 0 }) undefined other }
m.items_count({ count: 1 }) undefined other }
m.items_count({ count: 2 }) undefined other }
m.items_count({ count: 5 }) undefined other }
m.items_count({ count: 42 }) undefined other }

Formatage des dates et nombres

Formatting uses the browser's Intl API, decoupled from the translation locale. A German user in Switzerland gets German text but Swiss number formatting.

Date formatée 15 janv. 2025
Date formatée (long) mercredi 15 janvier 2025
Nombre formaté 1 234 567,89
Devise formatée (EUR) 1 234,50 €
Devise formatée (USD) 1 234,50 $US
Pourcentage formaté 85,4 %
Temps relatif avant-hier

Content Translation (Database)

The tc() helper translates JSON fields from the database, falling back through: current locale → English → first available.

tc(post.title) Bonjour le monde
tc(post.description) Ce contenu est stocké dans la base de données en JSON.

Database Schema Pattern

// JSON columns for translated content
title: jsonb('title').$type<Record<string, string>>()
// Data: { "en": "Hello", "de": "Hallo", "fr": "Bonjour" }

Sécurité de type

Toutes les clés de messages sont vérifiées à la compilation avec un support IntelliSense complet. Les clés manquantes ou les paramètres incorrects provoquent des erreurs de build, pas des erreurs d'exécution.

Compile-time Guarantees

// ✅ Type-safe with autocomplete
m.greeting({ name: 'Alice' });

// ❌ Compile error — missing parameter
m.greeting();

// ❌ Compile error — unknown message key
m.unknownKey();
← Back to Showcases