Lær hvordan du implementerer sømløs internasjonalisering (i18n) i dine Next.js-applikasjoner for å nå et globalt publikum. Dekker ruting, innholdsoversettelse og beste praksis.
Next.js Internasjonalisering: Bygg Flerspråklige Apper for et Globalt Publikum
I dagens sammenkoblede verden er det å bygge applikasjoner som henvender seg til et globalt publikum ikke lenger en luksus – det er en nødvendighet. Next.js, et kraftig React-rammeverk, gir robuste funksjoner for implementering av internasjonalisering (i18n), som lar deg lage flerspråklige applikasjoner som leverer en lokalisert opplevelse til brukere over hele verden. Denne omfattende guiden vil lede deg gjennom de essensielle konseptene, teknikkene og beste praksisene for å bygge internasjonaliserte Next.js-applikasjoner.
Forståelse av Internasjonalisering og Lokalisering
Før vi dykker ned i detaljene for Next.js i18n, la oss klargjøre nøkkelbegrepene:
- Internasjonalisering (i18n): Prosessen med å designe og utvikle en applikasjon slik at den enkelt kan tilpasses ulike språk og regioner uten å kreve ingeniørendringer. Dette innebærer å abstrahere tekst, formatering og andre lokalspesifikke elementer.
- Lokalisering (l10n): Prosessen med å tilpasse en applikasjon til et spesifikt språk og en spesifikk region. Dette inkluderer oversettelse av tekst, justering av dato- og tidsformater, valutasymboler og mer.
I hovedsak forbereder i18n applikasjonen din for lokalisering. Ved å skille språkavhengige elementer fra kjerne-koden, gjør du det enklere å lokalisere applikasjonen for forskjellige markeder.
Hvorfor Implementere Internasjonalisering i Next.js?
Å implementere i18n i din Next.js-applikasjon gir mange fordeler:
- Utvidet Rekkevidde: Nå et bredere publikum ved å tilby innhold på deres foretrukne språk.
- Forbedret Brukeropplevelse: Tilby en mer personlig og engasjerende opplevelse for brukere i forskjellige regioner.
- Forbedret SEO: Forbedre søkemotoroptimalisering (SEO) ved å tilby lokalisert innhold som retter seg mot spesifikke geografiske regioner.
- Økte Konverteringer: Øk konverteringer ved å presentere informasjon på brukerens morsmål, noe som skaper tillit og forståelse.
- Global Merkevaretilstedeværelse: Etabler en sterkere global merkevaretilstedeværelse ved å demonstrere en forpliktelse til inkludering og ved å imøtekomme ulike publikum.
Next.js i18n-funksjoner og Konfigurasjon
Next.js tilbyr innebygd støtte for i18n gjennom sine ruting- og innhåndteringsfunksjoner. Følgende er en oversikt over de viktigste funksjonene:
1. Konfigurere i18n i next.config.js
Kjernekonfigurasjonen for i18n ligger i filen next.config.js
. Her er et eksempel:
/** @type {import('next').NextConfig} */
const nextConfig = {
i18n: {
locales: ['en', 'es', 'fr'], // En liste over støttede locales (språkkoder)
defaultLocale: 'en', // Standard locale som skal brukes
localeDetection: true, // Aktiver/deaktiver automatisk gjenkjenning av locale basert på nettleserinnstillinger (valgfritt)
// domains: [
// {
// domain: 'example.com',
// defaultLocale: 'en',
// },
// {
// domain: 'example.es',
// defaultLocale: 'es',
// },
// ],
},
}
module.exports = nextConfig;
Forklaring:
locales
: En matrise som inneholder språkkodene (f.eks.'en'
for engelsk,'es'
for spansk,'fr'
for fransk) for språkene som støttes av applikasjonen din. Sørg for å følge ISO 639-1-språkkodene for konsistens.defaultLocale
: Standardspråket applikasjonen din vil bruke. Dette er språket som vises hvis ingen andre språk er spesifisert i URL-en eller gjenkjent fra brukerens nettleserinnstillinger. Velg et språk som er representativt for din primære målgruppe.localeDetection
: En boolsk verdi som styrer om Next.js automatisk skal gjenkjenne brukerens foretrukne språk basert på nettleserinnstillingene. Hvis den er satt tiltrue
, vil Next.js prøve å omdirigere brukeren til den riktige språkversjonen av nettstedet ditt.domains
(valgfritt): En matrise som lar deg knytte locales til spesifikke domener. Dette er nyttig hvis du har separate domener for forskjellige språk (f.eks.example.com
for engelsk,example.es
for spansk).
2. Ruting med Locale-prefikser
Next.js legger automatisk til locale-prefikser i ruter. For eksempel, hvis du har en side på /about
og locale er 'es' (spansk), vil URL-en bli /es/about
. Dette muliggjør forskjellige språkversjoner av sider og lar søkemotorer indeksere innhold for hver locale. Rammeverket håndterer omdirigering og ruting for deg.
3. Bruke useRouter
-hooken
useRouter
-hooken fra next/router
gir tilgang til gjeldende locale og annen rutinginformasjon.
import { useRouter } from 'next/router';
function MyComponent() {
const router = useRouter();
const { locale, locales, defaultLocale } = router;
return (
Gjeldende locale: {locale}
Tilgjengelige locales: {locales.join(', ')}
Standard locale: {defaultLocale}
);
}
export default MyComponent;
router
-objektet tilbyr følgende nøkkelegenskaper:
locale
: Den valgte locale (f.eks. 'en', 'es', 'fr').locales
: En matrise med alle støttede locales definert inext.config.js
.defaultLocale
: Standard locale satt inext.config.js
.asPath
: Stien som vises i nettleseren, inkludert locale-prefikset (f.eks./es/about
).pathname
: Stien uten locale-prefikset (f.eks./about
).
Strategier for Innholdsoversettelse
Når du har konfigurert din Next.js-applikasjon for i18n, må du implementere strategier for å oversette innholdet ditt. Her er flere populære tilnærminger:
1. Bruke et dedikert oversettelseshåndteringssystem (TMS)
For store prosjekter med mange språk, anbefales et TMS på det sterkeste. Populære alternativer inkluderer:
- Phrase: Et skybasert TMS med integrasjoner for ulike plattformer, inkludert Next.js. Tilbyr samarbeidsfunksjoner og automatiserte arbeidsflyter.
- Localize: Et annet skybasert TMS som støtter et bredt spekter av filformater og tilbyr funksjoner for oversettelseshåndtering.
- Crowdin: Et kraftig TMS som er veldig populært i åpen kildekode-miljøet, og som integreres godt med Next.js, slik at team effektivt kan oversette innhold.
Fordeler:
- Sentralisert oversettelseshåndtering.
- Samarbeidsfunksjoner for oversettere.
- Automatisering av oversettelsesarbeidsflyter.
- Integrasjon med din utviklingsarbeidsflyt.
2. Opprette JSON-oversettelsesfiler
For mindre prosjekter er det en enkel og effektiv metode å bruke JSON-filer til å lagre oversettelser.
Eksempel på katalogstruktur:
/src
├── locales
│ ├── en.json
│ └── es.json
├── components
│ └── MyComponent.js
└── pages
└── index.js
Eksempel en.json
:
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Eksempel es.json
:
{
"greeting": "¡Hola, mundo!",
"welcomeMessage": "Bienvenido a nuestro sitio web."
}
Eksempel 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;
Denne tilnærmingen gir fleksibilitet og er enkel for mindre prosjekter. Den er generelt lett å oppdatere og vedlikeholde.
3. Bruke et oversettelsesbibliotek
Flere JavaScript-biblioteker effektiviserer innholdsoversettelse i dine React-komponenter.
next-i18next
: Et populært bibliotek spesielt designet for Next.js. Det integreres godt med rammeverket og tilbyr funksjoner som server-side rendering (SSR) og klientside-oversettelse.react-i18next
: Et generelt i18n-bibliotek for React. Du kan bruke det i dine Next.js-applikasjoner, selv om det kan kreve mer konfigurasjon sammenlignet mednext-i18next
.
Eksempel med next-i18next
(Installasjon: npm install next-i18next i18next react-i18next
):
Opprett en i18n-konfigurasjonsfil (f.eks. i18n.js
i rotkatalogen din):
// 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 }
Opprett din Next.js-konfigurasjon for 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'],
},
// annen konfigurasjon
}
module.exports = nextConfig
Legg til konfigurasjonen og oversettelsesimporten i din _app.js
:
import { appWithTranslation } from 'next-i18next';
import '../styles/globals.css';
function MyApp({ Component, pageProps }) {
return ;
}
export default appWithTranslation(MyApp);
Opprett en mappe og fyll den med locales for oversettelsene dine.
/public
└── locales
├── en
│ └── common.json
├── es
│ └── common.json
└── fr
└── common.json
Eksempel en/common.json:
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Bruke oversettelsen i en komponent:
import { useTranslation } from 'next-i18next';
function MyComponent() {
const { t } = useTranslation('common');
return (
{t('greeting')}
{t('welcomeMessage')}
);
}
export default MyComponent;
Dette eksempelet bruker useTranslation
-hooken for å hente oversettelser basert på gjeldende locale.
Håndtering av Dynamiske Ruter og Statisk Sidegenerering (SSG)
Internasjonalisering blir mer komplisert når man håndterer dynamiske ruter (f.eks. blogginnlegg, produktsider) og statisk sidegenerering (SSG).
1. Dynamiske ruter (f.eks. /blogg/[slug])
For dynamiske ruter må du generere de riktige stiene for hver locale under byggetid ved hjelp av getStaticPaths
. Denne funksjonen returnerer en matrise med stier som Next.js skal forhåndsrendre.
export async function getStaticPaths() {
const paths = [];
const locales = ['en', 'es', 'fr'];
const posts = await fetchPosts(); // Hent data for blogginnlegg
posts.forEach(post => {
locales.forEach(locale => {
paths.push({
params: {
slug: post.slug,
},
locale,
});
});
});
return {
paths,
fallback: false, // eller 'blocking' hvis du vil vise en lastetilstand
};
}
export async function getStaticProps({ params, locale }) {
const post = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Forklaring:
getStaticPaths
: Denne funksjonen itererer gjennom blogginnleggene dine og genererer en sti for hvert innlegg og hver locale.params
-objektet inneholder ruteparametrene (f.eks. slug-en til blogginnlegget).locale
: Denne parameteren gir den gjeldende locale-en, slik at du kan hente det oversatte innholdet for den spesifikke locale-en.fallback
: Bestemmer hvordan Next.js håndterer stier som ikke er definert igetStaticPaths
.fallback: false
genererer 404-sider for udefinerte stier.fallback: 'blocking'
forhåndsrendrer sider ved behov.
2. Statisk Sidegenerering (SSG) med getStaticProps
I getStaticProps
kan du hente oversatt innhold basert på locale
-parameteren.
export async function getStaticProps({ params, locale }) {
// Hent innhold basert på locale og parametere
const { post } = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Funksjonen getPostBySlug
bør hente det oversatte innholdet for den gitte slug-en og locale-en, som kan hentes fra dine oversettelsesfiler, database eller et CMS.
3. Server-Side Rendering (SSR) med getServerSideProps
For innhold som må hentes på forespørselstidspunktet, bruk getServerSideProps
. Dette er nyttig hvis innholdet endres ofte eller er personlig tilpasset for hver bruker.
export async function getServerSideProps({ params, locale, req, res }) {
// Hent data basert på locale og parametere (f.eks. fra en database)
const data = await fetchData(params.slug, locale);
return {
props: {
data,
},
};
}
Beste Praksis for Next.js Internasjonalisering
Å følge disse beste praksisene vil hjelpe deg med å bygge robuste, vedlikeholdbare og brukervennlige flerspråklige applikasjoner:
- Planlegg Tidlig: Vurder internasjonalisering fra starten av prosjektet. Det er mye enklere å implementere det på forhånd enn å ettermontere det senere.
- Skill Innhold fra Kode: Lagre all oversettbar tekst i separate filer (f.eks. JSON-filer eller et TMS) og unngå å hardkode tekst direkte i komponentene dine.
- Bruk et Oversettelseshåndteringssystem (TMS): For større prosjekter kan et TMS effektivisere oversettelsesprosessen og forbedre samarbeidet.
- Test Grundig: Test applikasjonen din på alle støttede språk for å sikre nøyaktige oversettelser, korrekt formatering og riktig gjengivelse på tvers av forskjellige nettlesere og enheter. Test på ekte enheter, ikke bare emulatorer.
- Vurder Høyre-til-Venstre (RTL) Språk: Hvis du støtter språk som arabisk eller hebraisk, sørg for at designet og layoutet ditt tilpasser seg høyre-til-venstre tekstretning. Next.js håndterer ikke dette automatisk, så CSS eller andre løsninger kreves.
- Håndter Dato- og Tidsformatering: Bruk biblioteker eller innebygde funksjoner for å formatere datoer og klokkeslett i henhold til brukerens locale. Moment.js og date-fns er to populære og nyttige biblioteker.
- Håndter Tall- og Valutaformatering: Formater tall og valutasymboler riktig basert på brukerens locale.
- Optimaliser SEO: Bruk språkspesifikke metatagger (
hreflang
) for å hjelpe søkemotorer med å indeksere innholdet ditt riktig. Inkluder språkkoder i URL-ene dine. - Prioriter Brukeropplevelsen: Tilby en klar og intuitiv måte for brukere å bytte mellom språk. Vurder å tilby automatisk språkgjenkjenning basert på nettleserinnstillinger.
- Hold deg Oppdatert: Hold din Next.js-versjon og i18n-biblioteker oppdatert for å dra nytte av de nyeste funksjonene og sikkerhetsoppdateringene.
- Vurder Tilgjengelighet (a11y): Sørg for at det oversatte innholdet ditt er tilgjengelig for brukere med nedsatt funksjonsevne. Gi alternativ tekst for bilder og bruk passende ARIA-attributter. Bruk skjermlesere for å teste.
SEO-hensyn for Internasjonaliserte Nettsteder
Å optimalisere ditt internasjonaliserte nettsted for søkemotorer er avgjørende for å drive organisk trafikk fra hele verden. Her er noen sentrale SEO-beste praksiser:
hreflang
-tagger: Implementerhreflang
-tagger i<head>
-delen av HTML-koden din for å fortelle søkemotorer om språk- og regionale variasjoner av innholdet ditt. Dette er kritisk for SEO. For eksempel:<link rel="alternate" hreflang="en" href="https://example.com/en/" />
og<link rel="alternate" hreflang="es" href="https://example.com/es/" />
- Språkspesifikke URL-er: Bruk språkkoder i URL-ene dine (f.eks.
/en/about
,/es/acerca-de
). Dette indikerer tydelig språket på innholdet for både brukere og søkemotorer. - Lokalisert Innhold: Oversett innholdet ditt nøyaktig og naturlig. Maskinoversettelser bør gjennomgås av en som har språket som morsmål.
- Lokaliserte Metabeskrivelser og Titler: Skriv unike og overbevisende metabeskrivelser og titler for hvert språk for å forbedre klikkfrekvensen i søkeresultatene.
- XML-Nettstedskart: Opprett og send inn XML-nettstedskart som inkluderer alle språkvariasjoner av sidene dine.
- Intern Lenking: Bruk passende interne lenker mellom språkversjoner av innholdet ditt.
- Landspesifikk Søkeordsanalyse: Utfør søkeordsanalyse på hvert språk for å identifisere termene som brukere søker etter i hver region.
Eksempel: Bygge en Enkel Flerspråklig Blogg
La oss lage et forenklet eksempel på en flerspråklig blogg ved hjelp av Next.js. Dette vil gi en mer konkret illustrasjon av hvordan man anvender konseptene som er diskutert ovenfor.
1. Prosjektoppsett
Opprett et nytt Next.js-prosjekt:
npx create-next-app my-multi-lang-blog
cd my-multi-lang-blog
2. Konfigurere i18n (next.config.js
)
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
i18n: {
locales: ['en', 'es', 'fr'],
defaultLocale: 'en',
},
}
module.exports = nextConfig
3. Opprette Oversettelsesfiler
Opprett en locales
-mappe i rotkatalogen og legg til følgende JSON-filer:
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. Opprette Bloggpost-komponenten (f.eks. 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. Opprette Indekssiden (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;
Dette forenklede eksempelet viser de grunnleggende prinsippene for internasjonalisering i Next.js. Du kan utvide dette grunnleggende rammeverket til å inkludere mer komplekse funksjoner, som dynamiske ruter og integrasjon med oversettelseshåndteringssystemer. Vurder å forbedre lenkene ovenfor med Link
-komponenten og legge til det passende locale
-attributtet.
6. Kjøre Applikasjonen
Kjør applikasjonen med:
npm run dev
Nå kan du få tilgang til bloggen din på http://localhost:3000
(engelsk), http://localhost:3000/es
(spansk) og http://localhost:3000/fr
(fransk). Du bør se tittelen og blogginnleggets innhold oversatt basert på valgt locale.
Konklusjon
Next.js gir et omfattende sett med funksjoner for å implementere internasjonalisering i dine webapplikasjoner. Ved å følge prinsippene og teknikkene som er beskrevet i denne guiden, kan du lage flerspråklige applikasjoner som leverer lokaliserte opplevelser til brukere over hele verden. Husk å planlegge din i18n-strategi tidlig, velge riktig oversettelsesmetode for dine behov, og prioritere brukeropplevelsen. Med nøye planlegging og gjennomføring kan du bygge applikasjoner som appellerer til et globalt publikum og åpner for nye vekstmuligheter. Kontinuerlig læring, og å holde seg oppdatert på de nyeste utgivelsene og beste praksisene, vil sikre at du utnytter verktøyene og teknologiene dine effektivt.
Etter hvert som teknologien utvikler seg, kan vi forvente å se mer avanserte i18n-funksjoner dukke opp. Evnen til å nå brukere på tvers av forskjellige kulturer og språkgrupper vil forbli en sentral prioritet for applikasjonsutviklere over hele verden. Derfor er det å mestre grunnleggende i18n en verdifull ferdighet som vil øke din verdi i dagens globale utviklingslandskap.