Internationalisation (i18n)

createI18n gère des catalogues par langue avec interpolation {placeholder}, pluralisation, langue de repli, et détection depuis la requête (préfixe d'URL → cookie → Accept-Language). Chaque rendu est un choix serveur frais — pas de clignotement dans la mauvaise langue.

Astuce
Ordre de détection : préfixe de chemin (/fr/…) → cookie « locale » → Accept-Language (pondéré par q) → langue par défaut. Une clé absente retombe sur la langue de repli, puis sur la clé. Pour un routage /en/… à l'échelle du site, configurez [i18n] dans bext.config.toml.

Hola

¡Bienvenido a la tienda, Ada!

🛒 Tu carrito está vacío

Elige otro idioma:

Articles:01312

Langue active: es · Détectée depuis la requête: en

src/app/examples/i18n/page.tsxTSX
import { createI18n } from "@bext-stack/framework/i18n";

const i18n = createI18n({
  default: "en", fallback: "en",
  locales: {
    en: { greeting: "Welcome, {name}!", cart: "empty | 1 item | {count} items" },
    fr: { greeting: "Bienvenue, {name} !", cart: "vide | 1 article | {count} articles" },
  },
});

export async function loader({ request }) {
  // detection: path prefix → 'locale' cookie → Accept-Language → default
  const t = i18n.for(i18n.detect(request));
  return {
    greeting: t.t("greeting", { name: "Ada" }),  // interpolation
    cart:     t.n("cart", count),                // pluralization (empty|one|other)
  };
}