Apprenez à mettre en œuvre une internationalisation (i18n) transparente dans vos applications Next.js pour atteindre une audience mondiale. Couvre le routage, la traduction de contenu et les meilleures pratiques.
Internationalisation avec Next.js : Créer des applications multilingues pour une audience mondiale
Dans le monde interconnecté d'aujourd'hui, créer des applications qui s'adressent à un public mondial n'est plus un luxe – c'est une nécessité. Next.js, un puissant framework React, fournit des fonctionnalités robustes pour la mise en œuvre de l'internationalisation (i18n), vous permettant de créer des applications multilingues qui offrent une expérience localisée aux utilisateurs du monde entier. Ce guide complet vous présentera les concepts, techniques et meilleures pratiques essentiels pour créer des applications Next.js internationalisées.
Comprendre l'internationalisation et la localisation
Avant de plonger dans les spécificités de l'i18n de Next.js, clarifions les termes clés :
- Internationalisation (i18n) : Le processus de conception et de développement d'une application de manière à ce qu'elle puisse être facilement adaptée à diverses langues et régions sans nécessiter de modifications techniques. Cela implique d'abstraire le texte, le formatage et d'autres éléments spécifiques à la locale.
- Localisation (l10n) : Le processus d'adaptation d'une application à une langue et une région spécifiques. Cela inclut la traduction de texte, l'ajustement des formats de date et d'heure, des symboles monétaires, et plus encore.
Essentiellement, l'i18n prépare votre application à la localisation. En séparant les éléments dépendants de la langue du code principal, vous facilitez la localisation de l'application pour différents marchés.
Pourquoi mettre en œuvre l'internationalisation dans Next.js ?
La mise en œuvre de l'i18n dans votre application Next.js offre de nombreux avantages :
- Portée étendue : Atteignez un public plus large en fournissant du contenu dans leur langue préférée.
- Expérience utilisateur améliorée : Offrez une expérience plus personnalisée et engageante pour les utilisateurs de différentes régions.
- SEO amélioré : Améliorez l'optimisation pour les moteurs de recherche (SEO) en fournissant un contenu localisé qui cible des régions géographiques spécifiques.
- Augmentation des conversions : Augmentez les conversions en présentant les informations dans la langue maternelle de l'utilisateur, favorisant ainsi la confiance et la compréhension.
- Présence de marque mondiale : Établissez une présence de marque mondiale plus forte en démontrant un engagement envers l'inclusivité et en répondant aux besoins de divers publics.
Fonctionnalités et configuration de l'i18n de Next.js
Next.js offre un support intégré pour l'i18n grâce à ses fonctionnalités de routage et de gestion de contenu. Voici une ventilation des fonctionnalités importantes :
1. Configuration de l'i18n dans next.config.js
La configuration de base pour l'i18n réside dans le fichier next.config.js
. Voici un exemple :
/** @type {import('next').NextConfig} */
const nextConfig = {
i18n: {
locales: ['en', 'es', 'fr'], // Un tableau des locales (codes de langue) prises en charge
defaultLocale: 'en', // La locale par défaut à utiliser
localeDetection: true, // Activer/désactiver la détection automatique de la locale basée sur les paramètres du navigateur (optionnel)
// domains: [
// {
// domain: 'example.com',
// defaultLocale: 'en',
// },
// {
// domain: 'example.es',
// defaultLocale: 'es',
// },
// ],
},
}
module.exports = nextConfig;
Explication :
locales
: Un tableau contenant les codes de langue (par ex.,'en'
pour l'anglais,'es'
pour l'espagnol,'fr'
pour le français) des langues prises en charge par votre application. Assurez-vous de suivre les codes de langue ISO 639-1 pour la cohérence.defaultLocale
: La langue par défaut que votre application utilisera. C'est la langue affichée si aucune autre langue n'est spécifiée dans l'URL ou détectée à partir des paramètres du navigateur de l'utilisateur. Choisissez une langue représentative de votre public cible principal.localeDetection
: Une valeur booléenne qui contrôle si Next.js détecte automatiquement la langue préférée de l'utilisateur en fonction des paramètres de son navigateur. Si elle est définie surtrue
, Next.js tentera de rediriger l'utilisateur vers la version linguistique appropriée de votre site.domains
(optionnel) : Un tableau qui vous permet d'associer des locales à des domaines spécifiques. C'est utile si vous avez des domaines distincts pour différentes langues (par ex.,example.com
pour l'anglais,example.es
pour l'espagnol).
2. Routage avec des préfixes de locale
Next.js préfixe automatiquement les routes avec la locale. Par exemple, si vous avez une page à /about
et que la locale est 'es' (espagnol), l'URL deviendra /es/about
. Cela permet d'avoir différentes versions linguistiques des pages et permet aux moteurs de recherche d'indexer le contenu pour chaque locale. Le framework gère la redirection et le routage pour vous.
3. Utilisation du hook useRouter
Le hook useRouter
de next/router
donne accès à la locale actuelle et à d'autres informations de routage.
import { useRouter } from 'next/router';
function MyComponent() {
const router = useRouter();
const { locale, locales, defaultLocale } = router;
return (
Locale actuelle : {locale}
Locales disponibles : {locales.join(', ')}
Locale par défaut : {defaultLocale}
);
}
export default MyComponent;
L'objet router
offre les propriétés clés suivantes :
locale
: La locale actuellement sélectionnée (par ex., 'en', 'es', 'fr').locales
: Un tableau de toutes les locales prises en charge définies dansnext.config.js
.defaultLocale
: La locale par défaut définie dansnext.config.js
.asPath
: Le chemin tel qu'affiché dans le navigateur, y compris le préfixe de la locale (par ex.,/es/about
).pathname
: Le chemin sans le préfixe de la locale (par ex.,/about
).
Stratégies de traduction de contenu
Une fois que vous avez configuré votre application Next.js pour l'i18n, vous devrez mettre en œuvre des stratégies pour traduire votre contenu. Voici plusieurs approches populaires :
1. Utiliser un système de gestion de la traduction (TMS) dédié
Pour les projets à grande échelle avec de nombreuses langues, un TMS est fortement recommandé. Les options populaires incluent :
- Phrase : Un TMS basé sur le cloud avec des intégrations pour diverses plateformes, y compris Next.js. Offre des fonctionnalités collaboratives et des flux de travail automatisés.
- Localize : Un autre TMS basé sur le cloud qui prend en charge une large gamme de formats de fichiers et fournit des fonctionnalités de gestion de la traduction.
- Crowdin : Un TMS puissant très populaire dans la communauté open-source, qui s'intègre bien avec Next.js, permettant aux équipes de traduire efficacement le contenu.
Avantages :
- Gestion centralisée de la traduction.
- Fonctionnalités de collaboration pour les traducteurs.
- Automatisation des flux de travail de traduction.
- Intégration avec votre flux de développement.
2. Créer des fichiers de traduction JSON
Pour les projets plus petits, l'utilisation de fichiers JSON pour stocker les traductions est une méthode simple et efficace.
Exemple de structure de répertoires :
/src
├── locales
│ ├── en.json
│ └── es.json
├── components
│ └── MyComponent.js
└── pages
└── index.js
Exemple de en.json
:
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Exemple de es.json
:
{
"greeting": "¡Hola, mundo!",
"welcomeMessage": "Bienvenido a nuestro sitio web."
}
Exemple de MyComponent.js
:
import { useRouter } from 'next/router';
import en from '../locales/en.json';
import es from '../locales/es.json';
function MyComponent() {
const { locale } = useRouter();
const t = locale === 'es' ? es : en;
return (
{t.greeting}
{t.welcomeMessage}
);
}
export default MyComponent;
Cette approche offre de la flexibilité et est simple pour les projets plus petits. Elle est généralement facile à mettre à jour et à maintenir.
3. Utiliser une bibliothèque de traduction
Plusieurs bibliothèques JavaScript rationalisent la traduction de contenu au sein de vos composants React.
next-i18next
: Une bibliothèque populaire spécialement conçue pour Next.js. Elle s'intègre bien avec le framework et fournit des fonctionnalités telles que le rendu côté serveur (SSR) et la traduction côté client.react-i18next
: Une bibliothèque i18n générique pour React. Vous pouvez l'utiliser dans vos applications Next.js, bien qu'elle puisse nécessiter plus de configuration par rapport ànext-i18next
.
Exemple avec next-i18next
(Installation : npm install next-i18next i18next react-i18next
) :
Créez un fichier de configuration i18n (par ex., i18n.js
à la racine de votre projet) :
// i18n.js
import { createServerSideHelpers } from 'next-i18next'
import { i18n } from './next-i18next.config'
export function initI18next(req, res, namespaces = ['common']) {
const helpers = createServerSideHelpers(
req,
res,
i18n,
namespaces
)
return helpers
}
export { appWithTranslation } from 'next-i18next'
export { i18n }
Créez votre configuration Next.js pour next-i18next.
// next-i18next.config.js
const { i18n } = require('./next-i18next.config');
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
i18n: {
defaultLocale: 'en',
locales: ['en', 'es', 'fr'],
},
// autre configuration
}
module.exports = nextConfig
Ajoutez la configuration et l'importation de la traduction à votre _app.js
:
import { appWithTranslation } from 'next-i18next';
import '../styles/globals.css';
function MyApp({ Component, pageProps }) {
return ;
}
export default appWithTranslation(MyApp);
Créez un dossier et remplissez-le avec les locales pour vos traductions.
/public
└── locales
├── en
│ └── common.json
├── es
│ └── common.json
└── fr
└── common.json
Exemple en/common.json :
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Utilisation de la traduction dans un composant :
import { useTranslation } from 'next-i18next';
function MyComponent() {
const { t } = useTranslation('common');
return (
{t('greeting')}
{t('welcomeMessage')}
);
}
export default MyComponent;
Cet exemple utilise le hook useTranslation
pour récupérer les traductions en fonction de la locale actuelle.
Gestion des routes dynamiques et de la génération de sites statiques (SSG)
L'internationalisation devient plus complexe lorsqu'on traite des routes dynamiques (par ex., articles de blog, pages de produits) et la génération de sites statiques (SSG).
1. Routes dynamiques (par ex., /blog/[slug])
Pour les routes dynamiques, vous devrez générer les chemins corrects pour chaque locale au moment de la compilation en utilisant getStaticPaths
. Cette fonction renvoie un tableau de chemins que Next.js doit pré-générer.
export async function getStaticPaths() {
const paths = [];
const locales = ['en', 'es', 'fr'];
const posts = await fetchPosts(); // Récupérer les données des articles de blog
posts.forEach(post => {
locales.forEach(locale => {
paths.push({
params: {
slug: post.slug,
},
locale,
});
});
});
return {
paths,
fallback: false, // ou 'blocking' si vous voulez afficher un état de chargement
};
}
export async function getStaticProps({ params, locale }) {
const post = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Explication :
getStaticPaths
: Cette fonction parcourt vos articles de blog et génère un chemin pour chaque article et chaque locale. L'objetparams
contient les paramètres de la route (par ex., le slug de l'article de blog).locale
: Ce paramètre fournit la locale actuelle, vous permettant de récupérer le contenu traduit pour la locale spécifique.fallback
: Détermine comment Next.js gère les chemins non définis dansgetStaticPaths
.fallback: false
génère des pages 404 pour les chemins non définis.fallback: 'blocking'
pré-génère les pages à la demande.
2. Génération de site statique (SSG) avec getStaticProps
Dans getStaticProps
, vous pouvez récupérer le contenu traduit en fonction du paramètre locale
.
export async function getStaticProps({ params, locale }) {
// Récupérer le contenu en fonction de la locale et des paramètres
const { post } = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
La fonction getPostBySlug
doit récupérer le contenu traduit pour le slug et la locale donnés, qui pourrait être récupéré de vos fichiers de traduction, d'une base de données ou d'un CMS.
3. Rendu côté serveur (SSR) avec getServerSideProps
Pour le contenu qui doit être récupéré au moment de la requête, utilisez getServerSideProps
. C'est utile si le contenu change fréquemment ou est personnalisé pour chaque utilisateur.
export async function getServerSideProps({ params, locale, req, res }) {
// Récupérer des données en fonction de la locale et des paramètres (par ex., depuis une base de données)
const data = await fetchData(params.slug, locale);
return {
props: {
data,
},
};
}
Meilleures pratiques pour l'internationalisation avec Next.js
Suivre ces meilleures pratiques vous aidera à construire des applications multilingues robustes, maintenables et conviviales :
- Planifiez tôt : Envisagez l'internationalisation dès le début de votre projet. Il est beaucoup plus facile de la mettre en œuvre en amont que de l'adapter plus tard.
- Séparez le contenu du code : Stockez tout le texte traduisible dans des fichiers séparés (par ex., des fichiers JSON ou un TMS) et évitez de coder en dur le texte directement dans vos composants.
- Utilisez un système de gestion de la traduction (TMS) : Pour les projets plus importants, un TMS peut rationaliser le processus de traduction et améliorer la collaboration.
- Testez minutieusement : Testez votre application dans toutes les langues prises en charge pour garantir des traductions précises, un formatage correct et un rendu approprié sur différents navigateurs et appareils. Testez sur de vrais appareils, pas seulement des émulateurs.
- Considérez les langues de droite à gauche (RTL) : Si vous prenez en charge des langues comme l'arabe ou l'hébreu, assurez-vous que votre conception et votre mise en page s'adaptent à la direction du texte de droite à gauche. Next.js ne gère pas cela automatiquement, des solutions CSS ou autres sont donc nécessaires.
- Gérez le formatage de la date et de l'heure : Utilisez des bibliothèques ou des fonctions intégrées pour formater les dates et les heures en fonction de la locale de l'utilisateur. Moment.js et date-fns sont deux bibliothèques populaires qui sont utiles.
- Gérez le formatage des nombres et des devises : Formatez correctement les nombres et les symboles monétaires en fonction de la locale de l'utilisateur.
- Optimisez le SEO : Utilisez des balises méta spécifiques à la langue (
hreflang
) pour aider les moteurs de recherche à indexer correctement votre contenu. Incluez les codes de langue dans vos URL. - Donnez la priorité à l'expérience utilisateur : Fournissez un moyen clair et intuitif pour les utilisateurs de basculer entre les langues. Envisagez d'offrir une détection automatique de la langue en fonction des paramètres du navigateur.
- Restez à jour : Maintenez votre version de Next.js et vos bibliothèques i18n à jour pour bénéficier des dernières fonctionnalités et correctifs de sécurité.
- Considérez l'accessibilité (a11y) : Assurez-vous que votre contenu traduit est accessible aux utilisateurs handicapés. Fournissez un texte alternatif pour les images et utilisez les attributs ARIA appropriés. Utilisez des lecteurs d'écran pour tester.
Considérations SEO pour les sites web internationalisés
L'optimisation de votre site web internationalisé pour les moteurs de recherche est essentielle pour générer du trafic organique du monde entier. Voici quelques bonnes pratiques SEO clés :
- Balises
hreflang
: Implémentez des baliseshreflang
dans le<head>
de votre HTML pour indiquer aux moteurs de recherche les variations linguistiques et régionales de votre contenu. C'est essentiel pour le SEO. Par exemple :<link rel="alternate" hreflang="en" href="https://example.com/en/" />
et<link rel="alternate" hreflang="es" href="https://example.com/es/" />
- URL spécifiques à la langue : Utilisez des codes de langue dans vos URL (par ex.,
/en/about
,/fr/a-propos
). Cela indique clairement la langue du contenu aux utilisateurs et aux moteurs de recherche. - Contenu localisé : Traduisez votre contenu avec précision et naturel. Les traductions automatiques doivent être révisées par un locuteur natif.
- Méta-descriptions et titres localisés : Rédigez des méta-descriptions et des titres uniques et convaincants pour chaque langue afin d'améliorer les taux de clics dans les résultats de recherche.
- Sitemaps XML : Créez et soumettez des sitemaps XML qui incluent toutes les variations linguistiques de vos pages.
- Maillage interne : Utilisez des liens internes appropriés entre les versions linguistiques de votre contenu.
- Recherche de mots-clés par pays : Effectuez une recherche de mots-clés dans chaque langue pour identifier les termes que les utilisateurs recherchent dans chaque région.
Exemple : Créer un simple blog multilingue
Créons un exemple simplifié d'un blog multilingue en utilisant Next.js. Cela fournira une illustration plus concrète de la manière d'appliquer les concepts discutés ci-dessus.
1. Configuration du projet
Créez un nouveau projet Next.js :
npx create-next-app mon-blog-multilingue
cd mon-blog-multilingue
2. Configurer i18n (next.config.js
)
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
i18n: {
locales: ['en', 'es', 'fr'],
defaultLocale: 'en',
},
}
module.exports = nextConfig
3. Créer des fichiers de traduction
Créez un dossier locales
à la racine du projet et ajoutez les fichiers JSON suivants :
locales/en.json
:
{
"title": "Welcome to My Blog",
"postTitle": "My First Post",
"postContent": "This is the content of my first blog post."
}
locales/es.json
:
{
"title": "Bienvenido a mi Blog",
"postTitle": "Mi Primer Post",
"postContent": "Este es el contenido de mi primer publicación de blog."
}
locales/fr.json
:
{
"title": "Bienvenue sur Mon Blog",
"postTitle": "Mon Premier Article",
"postContent": "Ceci est le contenu de mon premier article de blog."
}
4. Créer le composant d'article de blog (par ex., components/BlogPost.js
)
import { useRouter } from 'next/router';
import en from '../locales/en.json';
import es from '../locales/es.json';
import fr from '../locales/fr.json';
function BlogPost() {
const router = useRouter();
const { locale } = router;
let translations;
switch (locale) {
case 'es':
translations = es;
break;
case 'fr':
translations = fr;
break;
default:
translations = en;
}
return (
{translations.postTitle}
{translations.postContent}
);
}
export default BlogPost;
5. Créer la page d'accueil (pages/index.js
)
import { useRouter } from 'next/router';
import BlogPost from '../components/BlogPost';
import en from '../locales/en.json';
import es from '../locales/es.json';
import fr from '../locales/fr.json';
function HomePage() {
const router = useRouter();
const { locale, locales } = router;
let translations;
switch (locale) {
case 'es':
translations = es;
break;
case 'fr':
translations = fr;
break;
default:
translations = en;
}
return (
);
}
export default HomePage;
Cet exemple simplifié illustre les principes fondamentaux de l'internationalisation avec Next.js. Vous pouvez étendre ce cadre de base pour inclure des fonctionnalités plus complexes, telles que des routes dynamiques et l'intégration avec des systèmes de gestion de la traduction. Envisagez d'améliorer les liens ci-dessus avec le composant Link
et d'ajouter l'attribut locale
approprié.
6. Lancer l'application
Lancez l'application avec :
npm run dev
Vous pouvez maintenant accéder à votre blog à http://localhost:3000
(anglais), http://localhost:3000/es
(espagnol) et http://localhost:3000/fr
(français). Vous devriez voir le titre et le contenu de l'article de blog traduits en fonction de la locale sélectionnée.
Conclusion
Next.js fournit un ensemble complet de fonctionnalités pour la mise en œuvre de l'internationalisation dans vos applications web. En suivant les principes et les techniques décrits dans ce guide, vous pouvez créer des applications multilingues qui offrent des expériences localisées aux utilisateurs du monde entier. N'oubliez pas de planifier votre stratégie i18n à l'avance, de choisir la bonne méthode de traduction pour vos besoins et de donner la priorité à l'expérience utilisateur. Avec une planification et une exécution minutieuses, vous pouvez créer des applications qui résonnent avec un public mondial et débloquent de nouvelles opportunités de croissance. L'apprentissage continu, le suivi des dernières versions et des meilleures pratiques garantiront que vous utilisez efficacement vos outils et technologies.
À mesure que la technologie progresse, attendez-vous à voir émerger des fonctionnalités i18n plus avancées. La capacité d'atteindre les utilisateurs à travers différentes cultures et groupes linguistiques restera une priorité clé pour les développeurs d'applications du monde entier. Par conséquent, la maîtrise des fondamentaux de l'i18n est une compétence précieuse qui augmentera votre valeur dans le paysage du développement mondial d'aujourd'hui.