Next.js

i18next-resources-to-backend :
charger les traductions à la demande

par ScornidigitalMis à jour le 8 juillet 2026Gembloux, Belgique
Définition

i18next-resources-to-backend est un plugin i18next qui charge les ressources de traduction via une fonction — souvent un import dynamique — au lieu d'un serveur HTTP. Chaque couple langue/namespace devient ainsi un fragment chargé à la demande.

i18next-resources-to-backend répond à une question précise : comment donner ses traductions à i18next sans tout charger d’un coup, ni monter un serveur dédié ?

Une simple fonction remplace le backend HTTP, et chaque langue devient un fragment chargé à la demande.

Principe et usage

Le plugin fournit à i18next une fonction qui retourne les ressources pour une langue et un namespace donnés — le plus souvent un import dynamique. Aucune requête HTTP, aucun serveur dédié. Les traductions vivent dans le code source et sont fragmentées au build.

i18next
  .use(resourcesToBackend(
    (language, namespace) => import(`./locales/${language}/${namespace}.json`)
  ))
  .init({ lng: 'fr', fallbackLng: 'fr' })

Avec Next.js, chaque instance i18next est créée par requête pour le rendu serveur, évitant les conflits de langue. Les traductions alimentent aussi bien les Server Components que le SSR classique, sans infrastructure HTTP séparée.

Points clés

Attention au chemin d’import : les bundlers ont besoin d’un préfixe littéral pour découper les fragments. Côté serveur, isolez l’instance par requête. L’initialisation est asynchrone, il faut l’attendre avant d’afficher du texte.

Besoin d’une internationalisation robuste pour votre projet ? Demandez un devis ou appelez-nous au 0476 07 23 28.

Questions fréquentes

Ce qu'on nous demande souvent.

Une question qui n'est pas ici ? Écrivez-nous : on répond en clair, sans jargon, sous 24 h.

Poser votre question

À quoi sert i18next-resources-to-backend ?

C'est un plugin (un « backend » au sens d'i18next) qui indique au moteur comment récupérer les traductions. Plutôt que de tout charger d'un bloc au démarrage, ou d'aller chercher chaque fichier via une requête HTTP, il délègue le chargement à une fonction que vous écrivez.

Cette fonction reçoit une langue et un namespace, et renvoie les ressources correspondantes — le plus souvent au moyen d'un import dynamique JavaScript. Résultat : chaque fichier de langue est découpé en fragment et n'est téléchargé que lorsqu'il est réellement nécessaire.

Quelle différence avec i18next-http-backend ?

i18next-http-backend va chercher les fichiers de traduction sur un serveur via des requêtes HTTP, à l'exécution. i18next-resources-to-backend, lui, ne fait aucune requête réseau explicite : il exécute votre fonction, qui retourne les données. Quand cette fonction est un import dynamique, c'est le bundler (webpack ou Turbopack) qui gère le découpage en fragments et leur chargement.

On garde donc le lazy-loading, mais les traductions sont intégrées au build plutôt que servies par un backend séparé. Plus simple à déployer, et compatible avec le rendu côté serveur.

Est-il adapté à Next.js et à l'App Router ?

Oui, c'est même l'un de ses usages les plus répandus. Dans l'App Router, on crée une instance i18next par requête pour le rendu serveur, et ce plugin fournit les traductions sans dépendre d'un serveur HTTP dédié.

Il fonctionne aussi bien côté serveur (Server Components, SSR) que côté client, ce qui évite d'écrire deux mécaniques de chargement différentes. C'est pour cela qu'on le retrouve dans la plupart des exemples d'internationalisation modernes avec Next.js.

Comment s'installe-t-il et se configure-t-il ?

On l'installe avec son gestionnaire de paquets (npm install i18next-resources-to-backend), puis on l'enregistre sur l'instance i18next avec .use().

Le plugin est un export par défaut : on l'appelle en lui passant une fonction (langue, namespace) qui retourne une promesse de ressources — typiquement import(`./locales/${langue}/${namespace}.json`). i18next appelle ensuite cette fonction automatiquement dès qu'il a besoin d'un couple langue/namespace non encore chargé.

Quels sont les pièges les plus courants ?

Le premier concerne le chemin d'import : les bundlers ont besoin d'une partie littérale (un préfixe de dossier fixe) pour créer les fragments ; un chemin entièrement variable peut échouer. Le deuxième est le partage d'instance : côté serveur, réutiliser une même instance globale entre plusieurs requêtes peut mélanger les langues — il faut en créer une par requête.

Enfin, l'import de fichiers JSON suppose une configuration adéquate du projet, et l'initialisation étant asynchrone, il faut l'attendre avant d'afficher du texte traduit.

Faut-il un serveur ou une API pour l'utiliser ?

Non, c'est justement son intérêt. Les traductions vivent dans votre code source et sont empaquetées au build sous forme de fragments.

Aucune API dédiée aux libellés n'est nécessaire. Si vos contenus proviennent d'un back-office, vous pouvez toujours faire renvoyer par la fonction des données issues d'une API, mais ce n'est pas requis pour un site dont les traductions sont versionnées avec le code.

Écrit par le studio

Scornidigital

Studio web full-stack à Gembloux. On code des sites en React, Vue, Laravel… et on choisit la techno qui sert vraiment votre projet — pas l'inverse.