Posez votre question et obtenez un résumé du document en referencant cette page et le Provider AI de votre choix
Historique des versions
- "Ajout du comparatif des étoiles GitHub"v8.9.818/05/2026
- "Initialisation du benchmark"v8.7.1206/01/2026
Le contenu de cette page a été traduit à l'aide d'une IA.
Voir la dernière version du contenu original en anglaisSi vous avez une idée d’amélioration pour améliorer cette documentation, n’hésitez pas à contribuer en submitant une pull request sur GitHub.
Lien GitHub de la documentationCopier le Markdown du doc dans le presse-papiers
Bibliothèques i18n Solid - Rapport de Benchmark 2026
Cette page est un rapport de benchmark pour les solutions i18n sur Solid.
Table des Matières
Benchmark Interactif
Référence des résultats :
Voir les données complètes du benchmark
Voir le dépôt complet du benchmark ici.
Introduction
Les solutions d'internationalisation figurent parmi les dépendances les plus lourdes d'une application Solid. Le risque principal est d'embarquer du contenu inutile : les traductions d'autres pages et d'autres locales dans le bundle d'une seule route.
À mesure que votre application grandit, ce problème peut rapidement faire exploser la quantité de JavaScript envoyée au client et ralentir la navigation.
En pratique, pour les implémentations les moins optimisées, une page internationalisée peut finir par être plusieurs fois plus lourde que la version sans i18n.
L'autre impact concerne l'expérience développeur (DX) : la façon dont vous déclarez le contenu, les types, l'organisation des namespaces, le chargement dynamique et la réactivité lors du changement de langue.
TL;DR
- Intlayer : Choix recommandé pour les applications Solid professionnelles nécessitant des fonctionnalités avancées et une optimisation poussée (v8.7.12).
- @solid-primitives/i18n : Excellente alternative légère pour les projets simples, bien qu'il manque de fonctionnalités avancées comme le lazy loading.
- solid-i18next : Option standard mais lourde (~4.7× Intlayer) avec les mêmes inconvénients que React i18next.
- Paraglide : Approche innovante mais DX complexe et problèmes de tree-shaking dans certaines configurations.
Testez votre application
Pour repérer rapidement les problèmes de fuite i18n, j'ai mis en place un scanner gratuit disponible ici.
Le problème
Deux leviers sont essentiels pour limiter le coût d'une application multilingue :
- Découper le contenu par page / namespace afin de ne pas charger des dictionnaires entiers quand on n'en a pas besoin
- Charger la bonne locale dynamiquement, uniquement quand nécessaire
Comprendre les limitations techniques de ces approches :
Chargement dynamique
Sans chargement dynamique, la plupart des solutions gardent les messages en mémoire dès le premier rendu, ce qui ajoute un surcoût important pour les applications ayant beaucoup de routes et de langues.
Avec le chargement dynamique, vous acceptez un compromis : moins de JS initial, mais parfois une requête supplémentaire lors du changement de langue.
Découpage du contenu (Splitting)
Les syntaxes basées sur t('a.b.c') sont très pratiques mais encouragent souvent la conservation de gros objets JSON au runtime. Ce modèle rend le tree-shaking difficile à moins que la bibliothèque ne propose une réelle stratégie de découpage par page.
Méthodologie
Pour ce benchmark, nous avons comparé les bibliothèques suivantes :
Base App(Pas de bibliothèque i18n)solid-intlayer(v8.7.12)@solid-primitives/i18n(v2.2.1)solid-i18next(v17.0.2)@inlang/paraglide-js(v2.17.0)
Le framework utilisé est Solid avec une application multilingue de 10 pages et 10 langues.
Nous avons comparé quatre stratégies de chargement :
Ouvrir le tableau dans une fenêtre modale pour voir tout le contenu clairement
| Stratégie | Sans namespaces (global) | Avec namespaces (scoped) |
|---|---|---|
| Chargement statique | Static : Tout en mémoire au démarrage. | Scoped static : Divisé par namespace ; tout chargé au démarrage. |
| Chargement dynamique | Dynamic : Chargement à la demande par locale. | Scoped dynamic : Chargement granulaire par namespace et locale. |
Résumé des stratégies
- Static : Simple ; pas de latence réseau après le chargement initial. Inconvénient : taille de bundle importante.
- Dynamic : Réduit le poids initial (lazy-loading). Idéal lorsque vous avez de nombreuses locales.
- Scoped static : Organise bien le code (séparation logique) sans requêtes réseau supplémentaires complexes.
- Scoped dynamic : Meilleure approche pour le code splitting et la performance. Minimise la mémoire en ne chargeant que ce dont la vue actuelle et la locale active ont besoin.
Étoiles GitHub
Les étoiles GitHub sont un indicateur fort de la popularité d'un projet, de la confiance de la communauté et de sa pertinence à long terme. Bien qu'elles ne soient pas une mesure directe de la qualité technique, elles reflètent le nombre de développeurs qui trouvent le projet utile, suivent ses progrès et sont susceptibles de l'adopter. Pour estimer la valeur d'un projet, les étoiles aident à comparer l'attraction entre les alternatives et fournissent des informations sur la croissance de l'écosystème.
Résultats détaillés
1 - Solutions à éviter
Aucune solution claire à éviter dans l'écosystème Solid.
2 - Solutions acceptables
(solid-i18next) ([email protected]) :
solid-i18next est probablement l'option la plus populaire car elle fut l'une des premières à servir les besoins i18n des applications JS. Elle dispose également d'un large éventail de plugins communautaires pour des problèmes spécifiques.
Le paquet est lourd (~14.6 Ko, soit environ 4.7× solid-intlayer).
Pourtant, elle partage les mêmes inconvénients majeurs que les stacks basées sur t('a.b.c') : les optimisations sont possibles mais très gourmandes en temps, et les gros projets risquent de mauvaises pratiques (namespaces + chargement dynamique + types).
(@solid-primitives/i18n) (@solid-primitives/[email protected]) :
Solid primitive est extrêmement léger et efficace. Je recommande cette solution pour les petits projets, mais elle peut rapidement manquer de fonctionnalités pour des solutions professionnelles incluant la gestion des cookies, la redirection proxy, les formateurs, etc. Elle manque également de lazy loading et de découpage des namespaces pour l'optimisation de la taille des pages.
(Paraglide) (@inlang/[email protected]) :
Paraglide propose une approche innovante et bien pensée. Pourtant, dans ce benchmark, le tree-shaking dont leur entreprise fait la publicité n'a pas fonctionné pour mon implémentation. Le workflow et la DX sont également plus complexes d'autres options.
Personnellement, je n'aime pas devoir régénérer des fichiers JS avant chaque push, ce qui crée un risque constant de conflit de fusion via les PRs.
Enfin, par rapport à d'autres solutions, Paraglide n'utilise pas de store (ex: Solid signal) pour récupérer la locale actuelle afin de rendre le contenu. Pour chaque nœud analysé, il demandera la locale au localStorage / cookie etc. Cela conduit à l'exécution d'une logique inutile qui impacte la réactivité des composants.
3 - Recommandations
(Intlayer) ([email protected]) :
Je ne jugerai pas personnellement solid-intlayer par souci d'objectivité, puisqu'il s'agit de ma propre solution.
Note personnelle
Cette note est personnelle et n'affecte pas les résultats du benchmark. Pourtant, dans le monde de l'i18n, on voit souvent un consensus autour d'un pattern comme const t = useTranslation('xx') + <>{t('xx.xx')}</> pour le contenu traduit.
Dans les applications Solid, injecter une fonction en tant que JSX.Element est, à mon avis, un anti-pattern. Cela ajoute également une complexité évitable et un surcoût d'exécution JavaScript (même s'il est à peine perceptible).