Învățați cum să implementați internaționalizarea (i18n) în aplicațiile Next.js pentru a ajunge la un public global. Acoperă rutarea, traducerea conținutului și cele mai bune practici.
Internaționalizare în Next.js: Construirea Aplicațiilor Multilingve pentru un Public Global
În lumea interconectată de astăzi, construirea de aplicații care se adresează unui public global nu mai este un lux – este o necesitate. Next.js, un framework React puternic, oferă funcționalități robuste pentru implementarea internaționalizării (i18n), permițându-vă să creați aplicații multilingve care oferă o experiență localizată utilizatorilor din întreaga lume. Acest ghid cuprinzător vă va prezenta conceptele, tehnicile și cele mai bune practici esențiale pentru construirea de aplicații Next.js internaționalizate.
Înțelegerea Internaționalizării și Localizării
Înainte de a aprofunda specificul i18n în Next.js, să clarificăm termenii cheie:
- Internaționalizare (i18n): Procesul de proiectare și dezvoltare a unei aplicații astfel încât să poată fi adaptată cu ușurință la diverse limbi și regiuni fără a necesita modificări de inginerie. Aceasta implică abstractizarea textului, a formatării și a altor elemente specifice localului.
- Localizare (l10n): Procesul de adaptare a unei aplicații la o anumită limbă și regiune. Aceasta include traducerea textului, ajustarea formatelor de dată și oră, simboluri valutare și multe altele.
În esență, i18n pregătește aplicația pentru localizare. Prin separarea elementelor dependente de limbă de codul de bază, faceți mai ușoară localizarea aplicației pentru diferite piețe.
De ce să Implementăm Internaționalizarea în Next.js?
Implementarea i18n în aplicația dumneavoastră Next.js oferă numeroase beneficii:
- Acoperire Extinsă: Ajungeți la un public mai larg oferind conținut în limba preferată.
- Experiență de Utilizare Îmbunătățită: Oferiți o experiență mai personalizată și mai captivantă pentru utilizatorii din diferite regiuni.
- SEO Îmbunătățit: Îmbunătățiți optimizarea pentru motoarele de căutare (SEO) prin furnizarea de conținut localizat care vizează regiuni geografice specifice.
- Conversii Crescute: Creșteți conversiile prin prezentarea informațiilor în limba maternă a utilizatorului, cultivând încrederea și înțelegerea.
- Prezență Globală a Brandului: Stabiliți o prezență mai puternică a brandului la nivel global, demonstrând un angajament față de incluziune și satisfacerea publicurilor diverse.
Funcționalități și Configurare i18n în Next.js
Next.js oferă suport încorporat pentru i18n prin funcționalitățile sale de rutare și gestionare a conținutului. Următoarea este o prezentare a funcționalităților importante:
1. Configurarea i18n în next.config.js
Configurarea de bază pentru i18n se află în fișierul next.config.js
. Iată un exemplu:
/** @type {import('next').NextConfig} */
const nextConfig = {
i18n: {
locales: ['en', 'es', 'fr'], // O listă de locale suportate (coduri de limbă)
defaultLocale: 'en', // Localul implicit de utilizat
localeDetection: true, // Activează/dezactivează detecția automată a localului pe baza setărilor browserului (opțional)
// domains: [
// {
// domain: 'example.com',
// defaultLocale: 'en',
// },
// {
// domain: 'example.es',
// defaultLocale: 'es',
// },
// ],
},
}
module.exports = nextConfig;
Explicație:
locales
: O listă care conține codurile de limbă (de ex.,'en'
pentru engleză,'es'
pentru spaniolă,'fr'
pentru franceză) ale limbilor suportate de aplicația dumneavoastră. Asigurați-vă că respectați codurile de limbă ISO 639-1 pentru consecvență.defaultLocale
: Limba implicită pe care o va folosi aplicația dumneavoastră. Aceasta este limba afișată dacă nicio altă limbă nu este specificată în URL sau detectată din setările browserului utilizatorului. Alegeți o limbă reprezentativă pentru publicul țintă principal.localeDetection
: O valoare booleană care controlează dacă Next.js detectează automat limba preferată a utilizatorului pe baza setărilor browserului. Dacă este setat petrue
, Next.js va încerca să redirecționeze utilizatorul către versiunea corespunzătoare a site-ului în limba respectivă.domains
(opțional): O listă care vă permite să asociați locale cu domenii specifice. Acest lucru este util dacă aveți domenii separate pentru limbi diferite (de ex.,example.com
pentru engleză,example.es
pentru spaniolă).
2. Rutare cu Prefixe de Locale
Next.js adaugă automat un prefix cu localul la rute. De exemplu, dacă aveți o pagină la /about
și localul este 'es' (spaniolă), URL-ul va deveni /es/about
. Acest lucru permite versiuni diferite ale paginilor în limbi diferite și permite motoarelor de căutare să indexeze conținutul pentru fiecare local. Framework-ul gestionează redirecționarea și rutarea pentru dumneavoastră.
3. Utilizarea Hook-ului useRouter
Hook-ul useRouter
din next/router
oferă acces la localul curent și la alte informații de rutare.
import { useRouter } from 'next/router';
function MyComponent() {
const router = useRouter();
const { locale, locales, defaultLocale } = router;
return (
Localul curent: {locale}
Locale disponibile: {locales.join(', ')}
Localul implicit: {defaultLocale}
);
}
export default MyComponent;
Obiectul router
oferă următoarele proprietăți cheie:
locale
: Localul selectat în prezent (de ex., 'en', 'es', 'fr').locales
: O listă cu toate localele suportate, definite înnext.config.js
.defaultLocale
: Localul implicit setat înnext.config.js
.asPath
: Calea așa cum este afișată în browser, inclusiv prefixul localului (de ex.,/es/about
).pathname
: Calea fără prefixul localului (de ex.,/about
).
Strategii de Traducere a Conținutului
Odată ce ați configurat aplicația Next.js pentru i18n, va trebui să implementați strategii pentru traducerea conținutului. Iată câteva abordări populare:
1. Utilizarea unui Sistem Dedicat de Management al Traducerilor (TMS)
Pentru proiecte la scară largă cu multe limbi, un TMS este foarte recomandat. Opțiunile populare includ:
- Phrase: Un TMS bazat pe cloud cu integrări pentru diverse platforme, inclusiv Next.js. Oferă funcționalități colaborative și fluxuri de lucru automatizate.
- Localize: Un alt TMS bazat pe cloud care suportă o gamă largă de formate de fișiere și oferă funcționalități de gestionare a traducerilor.
- Crowdin: Un TMS puternic, foarte popular în comunitatea open-source, care se integrează bine cu Next.js, permițând echipelor să traducă eficient conținutul.
Beneficii:
- Management centralizat al traducerilor.
- Funcționalități de colaborare pentru traducători.
- Automatizarea fluxurilor de lucru pentru traducere.
- Integrare cu fluxul de lucru de dezvoltare.
2. Crearea Fișierelor de Traducere JSON
Pentru proiecte mai mici, utilizarea fișierelor JSON pentru a stoca traducerile este o metodă simplă și eficientă.
Exemplu de Structură a Directoarelor:
/src
├── locales
│ ├── en.json
│ └── es.json
├── components
│ └── MyComponent.js
└── pages
└── index.js
Exemplu en.json
:
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Exemplu es.json
:
{
"greeting": "¡Hola, mundo!",
"welcomeMessage": "Bienvenido a nuestro sitio web."
}
Exemplu 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;
Această abordare oferă flexibilitate și este directă pentru proiecte mai mici. Este, în general, ușor de actualizat și întreținut.
3. Utilizarea unei Biblioteci de Traducere
Mai multe biblioteci JavaScript simplifică traducerea conținutului în componentele React.
next-i18next
: O bibliotecă populară special concepută pentru Next.js. Se integrează bine cu framework-ul și oferă funcționalități precum redarea pe server (SSR) și traducerea pe client.react-i18next
: O bibliotecă i18n de uz general pentru React. O puteți folosi în aplicațiile Next.js, deși ar putea necesita mai multă configurare în comparație cunext-i18next
.
Exemplu cu next-i18next
(Instalare: npm install next-i18next i18next react-i18next
):
Creați un fișier de configurare i18n (de ex., i18n.js
în directorul rădăcină):
// 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 }
Creați configurația Next.js pentru 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'],
},
// alte configurări
}
module.exports = nextConfig
Adăugați configurația și importul de traducere în fișierul _app.js
:
import { appWithTranslation } from 'next-i18next';
import '../styles/globals.css';
function MyApp({ Component, pageProps }) {
return ;
}
export default appWithTranslation(MyApp);
Creați un dosar și populați-l cu localele pentru traducerile dumneavoastră.
/public
└── locales
├── en
│ └── common.json
├── es
│ └── common.json
└── fr
└── common.json
Exemplu en/common.json:
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Utilizarea traducerii într-o componentă:
import { useTranslation } from 'next-i18next';
function MyComponent() {
const { t } = useTranslation('common');
return (
{t('greeting')}
{t('welcomeMessage')}
);
}
export default MyComponent;
Acest exemplu folosește hook-ul useTranslation
pentru a prelua traducerile pe baza localului curent.
Gestionarea Rutelor Dinamice și a Generării de Site-uri Statice (SSG)
Internaționalizarea devine mai complexă atunci când se lucrează cu rute dinamice (de ex., postări de blog, pagini de produse) și generarea de site-uri statice (SSG).
1. Rute Dinamice (de ex., /blog/[slug])
Pentru rutele dinamice, va trebui să generați căile corecte pentru fiecare local în timpul compilării folosind getStaticPaths
. Această funcție returnează o listă de căi pe care Next.js ar trebui să le pre-rendeze.
export async function getStaticPaths() {
const paths = [];
const locales = ['en', 'es', 'fr'];
const posts = await fetchPosts(); // Preluare date postări de blog
posts.forEach(post => {
locales.forEach(locale => {
paths.push({
params: {
slug: post.slug,
},
locale,
});
});
});
return {
paths,
fallback: false, // sau 'blocking' dacă doriți să afișați o stare de încărcare
};
}
export async function getStaticProps({ params, locale }) {
const post = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Explicație:
getStaticPaths
: Această funcție iterează prin postările de blog și generează o cale pentru fiecare postare și fiecare local. Obiectulparams
conține parametrii rutei (de ex., slug-ul postării de blog).locale
: Acest parametru furnizează localul curent, permițându-vă să preluați conținutul tradus pentru localul specific.fallback
: Determină cum gestionează Next.js căile care nu sunt definite îngetStaticPaths
.fallback: false
generează pagini 404 pentru căi nedefinite.fallback: 'blocking'
pre-rendează paginile la cerere.
2. Generarea de Site-uri Statice (SSG) cu getStaticProps
În getStaticProps
, puteți prelua conținut tradus pe baza parametrului locale
.
export async function getStaticProps({ params, locale }) {
// Preluare conținut pe baza localului și a parametrilor
const { post } = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Funcția getPostBySlug
ar trebui să preia conținutul tradus pentru slug-ul și localul dat, care ar putea fi preluat din fișierele de traducere, baza de date sau un CMS.
3. Redare pe Server (SSR) cu getServerSideProps
Pentru conținutul care trebuie preluat la momentul cererii, utilizați getServerSideProps
. Acest lucru este util dacă conținutul se schimbă frecvent sau este personalizat pentru fiecare utilizator.
export async function getServerSideProps({ params, locale, req, res }) {
// Preluare date pe baza localului și a parametrilor (de ex., dintr-o bază de date)
const data = await fetchData(params.slug, locale);
return {
props: {
data,
},
};
}
Cele mai bune practici pentru Internaționalizarea în Next.js
Respectarea acestor bune practici vă va ajuta să construiți aplicații multilingve robuste, ușor de întreținut și prietenoase cu utilizatorul:
- Planificați din Timp: Luați în considerare internaționalizarea încă de la începutul proiectului. Este mult mai ușor să o implementați de la început decât să o adaptați ulterior.
- Separați Conținutul de Cod: Stocați tot textul traductibil în fișiere separate (de ex., fișiere JSON sau un TMS) și evitați codarea directă a textului în componentele dumneavoastră.
- Utilizați un Sistem de Management al Traducerilor (TMS): Pentru proiecte mai mari, un TMS poate simplifica procesul de traducere și poate îmbunătăți colaborarea.
- Testați Tematic: Testați aplicația în toate limbile suportate pentru a asigura traduceri corecte, formatare corectă și redare corespunzătoare pe diferite browsere și dispozitive. Testați pe dispozitive reale, nu doar pe emulatoare.
- Luați în Considerare Limbile de la Dreapta la Stânga (RTL): Dacă suportați limbi precum araba sau ebraica, asigurați-vă că designul și layout-ul se adaptează la direcția textului de la dreapta la stânga. Next.js nu gestionează acest lucru automat, deci sunt necesare soluții CSS sau de altă natură.
- Gestionați Formatarea Datei și a Orei: Utilizați biblioteci sau funcții încorporate pentru a formata datele și orele în funcție de localul utilizatorului. Moment.js și date-fns sunt două biblioteci populare care sunt utile.
- Gestionați Formatarea Numerelor și a Monedei: Formatați corect numerele și simbolurile valutare pe baza localului utilizatorului.
- Optimizați SEO: Utilizați meta-etichete specifice limbii (
hreflang
) pentru a ajuta motoarele de căutare să indexeze corect conținutul. Includeți codurile de limbă în URL-uri. - Prioritizați Experiența Utilizatorului: Oferiți o modalitate clară și intuitivă pentru utilizatori de a comuta între limbi. Luați în considerare oferirea detecției automate a limbii pe baza setărilor browserului.
- Fiți la Curent: Mențineți versiunea Next.js și bibliotecile i18n la zi pentru a beneficia de cele mai recente funcționalități și patch-uri de securitate.
- Luați în Considerare Accesibilitatea (a11y): Asigurați-vă că conținutul tradus este accesibil utilizatorilor cu dizabilități. Furnizați text alternativ pentru imagini și utilizați atribute ARIA corespunzătoare. Utilizați cititoare de ecran pentru a testa.
Considerații SEO pentru Site-urile Internaționalizate
Optimizarea site-ului internaționalizat pentru motoarele de căutare este esențială pentru a atrage trafic organic din întreaga lume. Iată câteva practici SEO cheie:
- Etichete
hreflang
: Implementați etichetehreflang
în secțiunea<head>
a HTML-ului pentru a informa motoarele de căutare despre variațiile de limbă și regionale ale conținutului. Acest lucru este critic pentru SEO. De exemplu:<link rel="alternate" hreflang="en" href="https://example.com/en/" />
și<link rel="alternate" hreflang="es" href="https://example.com/es/" />
- URL-uri Specifice Limbii: Utilizați coduri de limbă în URL-uri (de ex.,
/en/about
,/es/acerca-de
). Acest lucru indică clar limba conținutului atât pentru utilizatori, cât și pentru motoarele de căutare. - Conținut Localizat: Traduceți conținutul cu acuratețe și natural. Traducerile automate ar trebui revizuite de un vorbitor nativ.
- Meta Descrieri și Titluri Localizate: Scrieți meta descrieri și titluri unice și convingătoare pentru fiecare limbă pentru a îmbunătăți ratele de clic în rezultatele căutării.
- Sitemap-uri XML: Creați și trimiteți sitemap-uri XML care includ toate variațiile de limbă ale paginilor dumneavoastră.
- Link-uri Interne: Utilizați link-uri interne corespunzătoare între versiunile de limbă ale conținutului.
- Cercetare de Cuvinte Cheie Specifică Țării: Efectuați cercetări de cuvinte cheie în fiecare limbă pentru a identifica termenii pe care utilizatorii îi caută în fiecare regiune.
Exemplu: Construirea unui Blog Multilingv Simplu
Să creăm un exemplu simplificat al unui blog multilingv folosind Next.js. Acesta va oferi o ilustrare mai concretă a modului de aplicare a conceptelor discutate mai sus.
1. Configurare Proiect
Creați un nou proiect Next.js:
npx create-next-app my-multi-lang-blog
cd my-multi-lang-blog
2. Configurare i18n (next.config.js
)
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
i18n: {
locales: ['en', 'es', 'fr'],
defaultLocale: 'en',
},
}
module.exports = nextConfig
3. Crearea Fișierelor de Traducere
Creați un dosar locales
în directorul rădăcină și adăugați următoarele fișiere JSON:
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. Crearea Componentei Blog Post (de 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. Crearea Paginii Index (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;
Acest exemplu simplificat prezintă principiile fundamentale ale internaționalizării în Next.js. Puteți extinde acest cadru de bază pentru a include funcționalități mai complexe, cum ar fi rute dinamice și integrarea cu sisteme de management al traducerilor. Luați în considerare îmbunătățirea link-urilor de mai sus cu componenta Link
și adăugați atributul locale
corespunzător.
6. Rularea Aplicației
Rulați aplicația cu:
npm run dev
Acum puteți accesa blogul la http://localhost:3000
(engleză), http://localhost:3000/es
(spaniolă) și http://localhost:3000/fr
(franceză). Ar trebui să vedeți titlul și conținutul postării de blog traduse în funcție de localul selectat.
Concluzie
Next.js oferă un set cuprinzător de funcționalități pentru implementarea internaționalizării în aplicațiile web. Urmând principiile și tehnicile prezentate în acest ghid, puteți crea aplicații multilingve care oferă experiențe localizate utilizatorilor din întreaga lume. Amintiți-vă să planificați strategia i18n din timp, să alegeți metoda de traducere potrivită pentru nevoile dumneavoastră și să prioritizați experiența utilizatorului. Cu o planificare și execuție atentă, puteți construi aplicații care rezonează cu un public global și deblochează noi oportunități de creștere. Învățarea continuă, menținerea la curent cu cele mai recente versiuni și cele mai bune practici vă vor asigura că utilizați eficient instrumentele și tehnologiile.
Pe măsură ce tehnologia avansează, așteptați-vă să apară funcționalități i18n mai avansate. Capacitatea de a ajunge la utilizatori din diferite culturi și grupuri lingvistice va rămâne o prioritate cheie pentru dezvoltatorii de aplicații din întreaga lume. Prin urmare, stăpânirea fundamentelor i18n este o abilitate valoroasă care vă va spori valoarea în peisajul global de dezvoltare de astăzi.