Naučite kako implementirati besprijekornu internacionalizaciju (i18n) u svoje Next.js aplikacije kako biste dosegnuli globalnu publiku. Pokriva usmjeravanje, prijevod sadržaja i najbolje prakse.
Internacionalizacija u Next.js-u: Izrada višejezičnih aplikacija za globalnu publiku
U današnjem povezanom svijetu, izrada aplikacija koje zadovoljavaju globalnu publiku više nije luksuz – to je nužnost. Next.js, moćan React radni okvir, pruža robusne značajke za implementaciju internacionalizacije (i18n), omogućujući vam stvaranje višejezičnih aplikacija koje pružaju lokalizirano iskustvo korisnicima diljem svijeta. Ovaj sveobuhvatni vodič provest će vas kroz ključne koncepte, tehnike i najbolje prakse za izradu internacionaliziranih Next.js aplikacija.
Razumijevanje internacionalizacije i lokalizacije
Prije nego što zaronimo u specifičnosti Next.js i18n, razjasnimo ključne pojmove:
- Internacionalizacija (i18n): Proces dizajniranja i razvoja aplikacije tako da se može lako prilagoditi različitim jezicima i regijama bez potrebe za inženjerskim promjenama. To uključuje apstrahiranje teksta, formatiranja i drugih elemenata specifičnih za lokalizaciju.
- Lokalizacija (l10n): Proces prilagodbe aplikacije određenom jeziku i regiji. To uključuje prevođenje teksta, prilagodbu formata datuma i vremena, simbola valuta i još mnogo toga.
U suštini, i18n priprema vašu aplikaciju za lokalizaciju. Odvajanjem jezično ovisnih elemenata od osnovnog koda, olakšavate lokalizaciju aplikacije za različita tržišta.
Zašto implementirati internacionalizaciju u Next.js?
Implementacija i18n u vašoj Next.js aplikaciji nudi brojne prednosti:
- Prošireni doseg: Dosegnite širu publiku pružanjem sadržaja na njihovom preferiranom jeziku.
- Poboljšano korisničko iskustvo: Ponudite personaliziranije i zanimljivije iskustvo korisnicima u različitim regijama.
- Poboljšan SEO: Poboljšajte optimizaciju za tražilice (SEO) pružanjem lokaliziranog sadržaja koji cilja specifične geografske regije.
- Povećane konverzije: Povećajte konverzije predstavljanjem informacija na materinjem jeziku korisnika, potičući povjerenje i razumijevanje.
- Globalna prisutnost brenda: Uspostavite snažniju globalnu prisutnost brenda demonstriranjem predanosti inkluzivnosti i prilagođavanjem raznolikoj publici.
Next.js i18n značajke i konfiguracija
Next.js nudi ugrađenu podršku za i18n kroz svoje značajke usmjeravanja i upravljanja sadržajem. Slijedi pregled važnih značajki:
1. Konfiguriranje i18n u next.config.js
Osnovna konfiguracija za i18n nalazi se unutar datoteke next.config.js
. Evo primjera:
/** @type {import('next').NextConfig} */
const nextConfig = {
i18n: {
locales: ['en', 'es', 'fr'], // Niz podržanih lokalizacija (jezičnih kodova)
defaultLocale: 'en', // Zadana lokalizacija koja će se koristiti
localeDetection: true, // Omogući/onemogući automatsko prepoznavanje lokalizacije na temelju postavki preglednika (opcionalno)
// domains: [
// {
// domain: 'example.com',
// defaultLocale: 'en',
// },
// {
// domain: 'example.es',
// defaultLocale: 'es',
// },
// ],
},
}
module.exports = nextConfig;
Objašnjenje:
locales
: Niz koji sadrži jezične kodove (npr.'en'
za engleski,'es'
za španjolski,'fr'
za francuski) jezika koje vaša aplikacija podržava. Svakako slijedite ISO 639-1 jezične kodove radi dosljednosti.defaultLocale
: Zadani jezik koji će vaša aplikacija koristiti. To je jezik koji se prikazuje ako nijedan drugi jezik nije naveden u URL-u ili prepoznat iz postavki preglednika korisnika. Odaberite jezik koji je reprezentativan za vašu primarnu ciljanu publiku.localeDetection
: Booleova vrijednost koja kontrolira hoće li Next.js automatski prepoznati preferirani jezik korisnika na temelju postavki njihovog preglednika. Ako je postavljeno natrue
, Next.js će pokušati preusmjeriti korisnika na odgovarajuću jezičnu verziju vaše stranice.domains
(opcionalno): Niz koji vam omogućuje povezivanje lokalizacija s određenim domenama. Ovo je korisno ako imate odvojene domene za različite jezike (npr.example.com
za engleski,example.es
za španjolski).
2. Usmjeravanje s prefiksima lokalizacije
Next.js automatski dodaje prefikse rutama s lokalizacijom. Na primjer, ako imate stranicu na /about
i lokalizacija je 'es' (španjolski), URL će postati /es/about
. To omogućuje različite jezične verzije stranica i omogućuje tražilicama indeksiranje sadržaja za svaku lokalizaciju. Radni okvir samostalno upravlja preusmjeravanjem i usmjeravanjem.
3. Korištenje useRouter
kuke
Kuka useRouter
iz next/router
pruža pristup trenutnoj lokalizaciji i drugim informacijama o usmjeravanju.
import { useRouter } from 'next/router';
function MyComponent() {
const router = useRouter();
const { locale, locales, defaultLocale } = router;
return (
Trenutna lokalizacija: {locale}
Dostupne lokalizacije: {locales.join(', ')}
Zadana lokalizacija: {defaultLocale}
);
}
export default MyComponent;
Objekt router
nudi sljedeća ključna svojstva:
locale
: Trenutno odabrana lokalizacija (npr. 'en', 'es', 'fr').locales
: Niz svih podržanih lokalizacija definiranih unext.config.js
.defaultLocale
: Zadana lokalizacija postavljena unext.config.js
.asPath
: Putanja kako je prikazana u pregledniku, uključujući prefiks lokalizacije (npr./es/about
).pathname
: Putanja bez prefiksa lokalizacije (npr./about
).
Strategije prevođenja sadržaja
Nakon što ste konfigurirali svoju Next.js aplikaciju za i18n, morat ćete implementirati strategije za prevođenje vašeg sadržaja. Evo nekoliko popularnih pristupa:
1. Korištenje namjenskog sustava za upravljanje prijevodima (TMS)
Za velike projekte s mnogo jezika, TMS se visoko preporučuje. Popularne opcije uključuju:
- Phrase: TMS temeljen na oblaku s integracijama za različite platforme, uključujući Next.js. Nudi značajke za suradnju i automatizirane radne tijekove.
- Localize: Još jedan TMS temeljen na oblaku koji podržava širok raspon formata datoteka i pruža značajke za upravljanje prijevodima.
- Crowdin: Moćan TMS koji je vrlo popularan u zajednici otvorenog koda i dobro se integrira s Next.js-om, omogućujući timovima učinkovito prevođenje sadržaja.
Prednosti:
- Centralizirano upravljanje prijevodima.
- Značajke za suradnju za prevoditelje.
- Automatizacija radnih tijekova prevođenja.
- Integracija s vašim razvojnim tijekom rada.
2. Stvaranje JSON datoteka za prijevode
Za manje projekte, korištenje JSON datoteka za pohranu prijevoda je jednostavna i učinkovita metoda.
Primjer strukture direktorija:
/src
├── locales
│ ├── en.json
│ └── es.json
├── components
│ └── MyComponent.js
└── pages
└── index.js
Primjer en.json
:
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Primjer es.json
:
{
"greeting": "¡Hola, mundo!",
"welcomeMessage": "Bienvenido a nuestro sitio web."
}
Primjer 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;
Ovaj pristup pruža fleksibilnost i jednostavan je za manje projekte. Općenito je lako ažurirati i održavati.
3. Korištenje biblioteke za prevođenje
Nekoliko JavaScript biblioteka pojednostavljuje prevođenje sadržaja unutar vaših React komponenti.
next-i18next
: Popularna biblioteka posebno dizajnirana za Next.js. Dobro se integrira s radnim okvirom i pruža značajke poput renderiranja na strani poslužitelja (SSR) i prevođenja na strani klijenta.react-i18next
: Općenamjenska i18n biblioteka za React. Možete je koristiti u svojim Next.js aplikacijama, iako može zahtijevati više konfiguracije u usporedbi snext-i18next
.
Primjer s next-i18next
(Instalacija: npm install next-i18next i18next react-i18next
):
Stvorite i18n konfiguracijsku datoteku (npr. i18n.js
u vašem korijenskom direktoriju):
// 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 }
Stvorite svoju Next.js konfiguraciju za 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'],
},
// druga konfiguracija
}
module.exports = nextConfig
Dodajte konfiguraciju i uvoz prijevoda u vašu _app.js
datoteku:
import { appWithTranslation } from 'next-i18next';
import '../styles/globals.css';
function MyApp({ Component, pageProps }) {
return ;
}
export default appWithTranslation(MyApp);
Stvorite mapu i popunite je lokalizacijama za vaše prijevode.
/public
└── locales
├── en
│ └── common.json
├── es
│ └── common.json
└── fr
└── common.json
Primjer en/common.json:
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Korištenje prijevoda u komponenti:
import { useTranslation } from 'next-i18next';
function MyComponent() {
const { t } = useTranslation('common');
return (
{t('greeting')}
{t('welcomeMessage')}
);
}
export default MyComponent;
Ovaj primjer koristi useTranslation
kuku za dohvaćanje prijevoda na temelju trenutne lokalizacije.
Rukovanje dinamičkim rutama i generiranjem statičkih stranica (SSG)
Internacionalizacija postaje složenija kada se radi s dinamičkim rutama (npr. postovi na blogu, stranice proizvoda) i generiranjem statičkih stranica (SSG).
1. Dinamičke rute (npr. /blog/[slug])
Za dinamičke rute, morat ćete generirati ispravne putanje za svaku lokalizaciju tijekom vremena izgradnje pomoću getStaticPaths
. Ova funkcija vraća niz putanja koje bi Next.js trebao unaprijed renderirati.
export async function getStaticPaths() {
const paths = [];
const locales = ['en', 'es', 'fr'];
const posts = await fetchPosts(); // Dohvati podatke o postovima na blogu
posts.forEach(post => {
locales.forEach(locale => {
paths.push({
params: {
slug: post.slug,
},
locale,
});
});
});
return {
paths,
fallback: false, // ili 'blocking' ako želite prikazati stanje učitavanja
};
}
export async function getStaticProps({ params, locale }) {
const post = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Objašnjenje:
getStaticPaths
: Ova funkcija iterira kroz vaše postove na blogu i generira putanju za svaki post i svaku lokalizaciju. Objektparams
sadrži parametre rute (npr. slug posta na blogu).locale
: Ovaj parametar pruža trenutnu lokalizaciju, omogućujući vam dohvaćanje prevedenog sadržaja za određenu lokalizaciju.fallback
: Određuje kako Next.js rukuje putanjama koje nisu definirane ugetStaticPaths
.fallback: false
generira 404 stranice za nedefinirane putanje.fallback: 'blocking'
unaprijed renderira stranice na zahtjev.
2. Generiranje statičkih stranica (SSG) s getStaticProps
U getStaticProps
, možete dohvatiti prevedeni sadržaj na temelju parametra locale
.
export async function getStaticProps({ params, locale }) {
// Dohvati sadržaj na temelju lokalizacije i parametara
const { post } = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Funkcija getPostBySlug
trebala bi dohvatiti prevedeni sadržaj za zadani slug i lokalizaciju, koji se može dohvatiti iz vaših datoteka prijevoda, baze podataka ili CMS-a.
3. Renderiranje na strani poslužitelja (SSR) s getServerSideProps
Za sadržaj koji se mora dohvatiti u vrijeme zahtjeva, koristite getServerSideProps
. Ovo je korisno ako se sadržaj često mijenja ili je personaliziran za svakog korisnika.
export async function getServerSideProps({ params, locale, req, res }) {
// Dohvati podatke na temelju lokalizacije i parametara (npr. iz baze podataka)
const data = await fetchData(params.slug, locale);
return {
props: {
data,
},
};
}
Najbolje prakse za internacionalizaciju u Next.js-u
Slijeđenje ovih najboljih praksi pomoći će vam u izgradnji robusnih, održivih i korisnički prihvatljivih višejezičnih aplikacija:
- Planirajte rano: Razmislite o internacionalizaciji od samog početka vašeg projekta. Mnogo je lakše implementirati je unaprijed nego je naknadno dodavati.
- Odvojite sadržaj od koda: Pohranite sav prevodivi tekst u odvojenim datotekama (npr. JSON datoteke ili TMS) i izbjegavajte tvrdo kodiranje teksta izravno u svoje komponente.
- Koristite sustav za upravljanje prijevodima (TMS): Za veće projekte, TMS može pojednostaviti proces prevođenja i poboljšati suradnju.
- Testirajte temeljito: Testirajte svoju aplikaciju na svim podržanim jezicima kako biste osigurali točne prijevode, ispravno formatiranje i pravilan prikaz na različitim preglednicima i uređajima. Testirajte na stvarnim uređajima, a ne samo na emulatorima.
- Razmislite o jezicima koji se pišu s desna na lijevo (RTL): Ako podržavate jezike poput arapskog ili hebrejskog, osigurajte da vaš dizajn i raspored podržavaju smjer teksta s desna na lijevo. Next.js to ne rješava automatski, pa su potrebna CSS ili druga rješenja.
- Rukujte formatiranjem datuma i vremena: Koristite biblioteke ili ugrađene funkcije za formatiranje datuma i vremena prema lokalizaciji korisnika. Moment.js i date-fns su dvije popularne biblioteke koje su korisne.
- Upravljajte formatiranjem brojeva i valuta: Ispravno formatirajte brojeve i simbole valuta na temelju lokalizacije korisnika.
- Optimizirajte SEO: Koristite jezično specifične meta oznake (
hreflang
) kako biste pomogli tražilicama da ispravno indeksiraju vaš sadržaj. Uključite jezične kodove u svoje URL-ove. - Prioritizirajte korisničko iskustvo: Pružite jasan i intuitivan način za korisnike da se prebacuju između jezika. Razmislite o ponudi automatskog prepoznavanja jezika na temelju postavki preglednika.
- Ostanite ažurirani: Održavajte svoju verziju Next.js-a i i18n biblioteke ažurnima kako biste iskoristili najnovije značajke i sigurnosne zakrpe.
- Razmislite o pristupačnosti (a11y): Osigurajte da je vaš prevedeni sadržaj dostupan korisnicima s invaliditetom. Pružite alternativni tekst za slike i koristite odgovarajuće ARIA atribute. Koristite čitače zaslona za testiranje.
SEO razmatranja za internacionalizirane web stranice
Optimiziranje vaše internacionalizirane web stranice za tražilice ključno je za privlačenje organskog prometa iz cijelog svijeta. Evo nekih ključnih SEO najboljih praksi:
hreflang
oznake: Implementirajtehreflang
oznake u<head>
vašeg HTML-a kako biste tražilicama rekli o jezičnim i regionalnim varijacijama vašeg sadržaja. Ovo je ključno za SEO. Na primjer:<link rel="alternate" hreflang="en" href="https://example.com/en/" />
i<link rel="alternate" hreflang="es" href="https://example.com/es/" />
- Jezično specifični URL-ovi: Koristite jezične kodove u svojim URL-ovima (npr.
/en/about
,/es/acerca-de
). To jasno ukazuje na jezik sadržaja i korisnicima i tražilicama. - Lokalizirani sadržaj: Prevedite svoj sadržaj točno i prirodno. Strojne prijevode trebao bi pregledati izvorni govornik.
- Lokalizirani meta opisi i naslovi: Napišite jedinstvene i privlačne meta opise i naslove za svaki jezik kako biste poboljšali stope klikanja u rezultatima pretraživanja.
- XML sitemaps: Stvorite i pošaljite XML sitemape koje uključuju sve jezične varijacije vaših stranica.
- Interno povezivanje: Koristite odgovarajuće interne veze između jezičnih verzija vašeg sadržaja.
- Istraživanje ključnih riječi specifično za zemlju: Provedite istraživanje ključnih riječi na svakom jeziku kako biste identificirali pojmove koje korisnici pretražuju u svakoj regiji.
Primjer: Izrada jednostavnog višejezičnog bloga
Stvorimo pojednostavljeni primjer višejezičnog bloga koristeći Next.js. Ovo će pružiti konkretniju ilustraciju kako primijeniti gore navedene koncepte.
1. Postavljanje projekta
Stvorite novi Next.js projekt:
npx create-next-app my-multi-lang-blog
cd my-multi-lang-blog
2. Konfigurirajte i18n (next.config.js
)
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
i18n: {
locales: ['en', 'es', 'fr'],
defaultLocale: 'en',
},
}
module.exports = nextConfig
3. Stvorite datoteke za prijevode
Stvorite mapu locales
u korijenskom direktoriju i dodajte sljedeće JSON datoteke:
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. Stvorite komponentu za blog post (npr. 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. Stvorite početnu stranicu (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;
Ovaj pojednostavljeni primjer prikazuje temeljna načela internacionalizacije u Next.js-u. Možete proširiti ovaj osnovni okvir kako biste uključili složenije značajke, kao što su dinamičke rute i integracija sa sustavima za upravljanje prijevodima. Razmislite o poboljšanju gornjih veza s komponentom Link
i dodavanju odgovarajućeg atributa locale
.
6. Pokrenite aplikaciju
Pokrenite aplikaciju s:
npm run dev
Sada možete pristupiti svom blogu na http://localhost:3000
(engleski), http://localhost:3000/es
(španjolski) i http://localhost:3000/fr
(francuski). Trebali biste vidjeti naslov i sadržaj posta na blogu prevedene na temelju odabrane lokalizacije.
Zaključak
Next.js pruža sveobuhvatan skup značajki za implementaciju internacionalizacije u vašim web aplikacijama. Slijedeći načela i tehnike navedene u ovom vodiču, možete stvoriti višejezične aplikacije koje pružaju lokalizirana iskustva korisnicima diljem svijeta. Ne zaboravite rano planirati svoju i18n strategiju, odabrati pravu metodu prevođenja za svoje potrebe i dati prioritet korisničkom iskustvu. Pažljivim planiranjem i izvedbom možete izgraditi aplikacije koje rezoniraju s globalnom publikom i otključati nove mogućnosti za rast. Kontinuirano učenje, praćenje najnovijih izdanja i najboljih praksi osigurat će da učinkovito koristite svoje alate i tehnologije.
Kako tehnologija napreduje, očekujte pojavu naprednijih i18n značajki. Sposobnost dosezanja korisnika u različitim kulturama i jezičnim skupinama ostat će ključni prioritet za programere aplikacija diljem svijeta. Stoga je ovladavanje osnovama i18n vrijedna vještina koja će povećati vašu vrijednost na današnjem globalnom razvojnom tržištu.