Lär dig hur du implementerar sömlös internationalisering (i18n) i dina Next.js-applikationer för att nå en global publik. Omfattar routing, innehållsöversättning och bästa praxis.
Next.js Internationalisering: Bygga flerspråkiga appar för en global publik
I dagens uppkopplade värld är det inte längre en lyx att bygga applikationer som riktar sig till en global publik – det är en nödvändighet. Next.js, ett kraftfullt React-ramverk, erbjuder robusta funktioner för att implementera internationalisering (i18n), vilket gör att du kan skapa flerspråkiga applikationer som levererar en lokaliserad upplevelse till användare världen över. Denna omfattande guide går igenom de väsentliga koncepten, teknikerna och bästa praxis för att bygga internationaliserade Next.js-applikationer.
Förståelse för Internationalisering och Lokalisering
Innan vi dyker in i detaljerna för Next.js i18n, låt oss klargöra nyckelbegreppen:
- Internationalisering (i18n): Processen att designa och utveckla en applikation så att den enkelt kan anpassas till olika språk och regioner utan att kräva tekniska ändringar. Detta innebär att abstrahera text, formatering och andra platsspecifika element.
- Lokalisering (l10n): Processen att anpassa en applikation till ett specifikt språk och en specifik region. Detta inkluderar översättning av text, justering av datum- och tidsformat, valutasymboler med mera.
I grund och botten förbereder i18n din applikation för lokalisering. Genom att separera språkberoende element från kärnkoden gör du det enklare att lokalisera applikationen för olika marknader.
Varför implementera internationalisering i Next.js?
Att implementera i18n i din Next.js-applikation erbjuder många fördelar:
- Utökad räckvidd: Nå en bredare publik genom att erbjuda innehåll på deras föredragna språk.
- Förbättrad användarupplevelse: Erbjud en mer personlig och engagerande upplevelse för användare i olika regioner.
- Förbättrad SEO: Förbättra sökmotoroptimering (SEO) genom att erbjuda lokaliserat innehåll som riktar sig till specifika geografiska regioner.
- Ökade konverteringar: Öka konverteringar genom att presentera information på användarens modersmål, vilket skapar förtroende och förståelse.
- Global varumärkesnärvaro: Etablera en starkare global varumärkesnärvaro genom att visa ett engagemang för inkludering och genom att tillgodose olika målgrupper.
Next.js i18n-funktioner och konfiguration
Next.js erbjuder inbyggt stöd för i18n genom sina routing- och innehållshanteringsfunktioner. Följande är en genomgång av de viktiga funktionerna:
1. Konfigurera i18n i next.config.js
Kärnkonfigurationen för i18n finns i filen next.config.js
. Här är ett exempel:
/** @type {import('next').NextConfig} */
const nextConfig = {
i18n: {
locales: ['en', 'es', 'fr'], // En array med stödda locales (språkkoder)
defaultLocale: 'en', // Standard-locale att använda
localeDetection: true, // Aktivera/inaktivera automatisk locale-detektering baserat på webbläsarinställningar (valfritt)
// domains: [
// {
// domain: 'example.com',
// defaultLocale: 'en',
// },
// {
// domain: 'example.es',
// defaultLocale: 'es',
// },
// ],
},
}
module.exports = nextConfig;
Förklaring:
locales
: En array som innehåller språkkoderna (t.ex.'en'
för engelska,'es'
för spanska,'fr'
för franska) för de språk som din applikation stöder. Se till att följa ISO 639-1-språkkoderna för konsekvens.defaultLocale
: Standardspråket som din applikation kommer att använda. Detta är det språk som visas om inget annat språk anges i URL:en eller upptäcks från användarens webbläsarinställningar. Välj ett språk som är representativt för din primära målgrupp.localeDetection
: Ett booleskt värde som styr om Next.js automatiskt ska upptäcka användarens föredragna språk baserat på deras webbläsarinställningar. Om det är satt tilltrue
kommer Next.js att försöka omdirigera användaren till den lämpliga språkversionen av din webbplats.domains
(valfritt): En array som låter dig associera locales med specifika domäner. Detta är användbart om du har separata domäner för olika språk (t.ex.example.com
för engelska,example.es
för spanska).
2. Routing med Locale-prefix
Next.js lägger automatiskt till ett prefix för routes med den aktuella locale. Om du till exempel har en sida på /about
och din locale är 'es' (spanska), blir URL:en /es/about
. Detta möjliggör olika språkversioner av sidor och gör att sökmotorer kan indexera innehåll för varje locale. Ramverket hanterar omdirigering och routing åt dig.
3. Använda useRouter
-hooken
useRouter
-hooken från next/router
ger tillgång till den aktuella locale och annan routinginformation.
import { useRouter } from 'next/router';
function MyComponent() {
const router = useRouter();
const { locale, locales, defaultLocale } = router;
return (
Current locale: {locale}
Available locales: {locales.join(', ')}
Default locale: {defaultLocale}
);
}
export default MyComponent;
router
-objektet erbjuder följande nyckelegenskaper:
locale
: Den för närvarande valda locale (t.ex. 'en', 'es', 'fr').locales
: En array med alla stödda locales definierade inext.config.js
.defaultLocale
: Standard-locale som angetts inext.config.js
.asPath
: Sökvägen som visas i webbläsaren, inklusive locale-prefixet (t.ex./es/about
).pathname
: Sökvägen utan locale-prefixet (t.ex./about
).
Strategier för innehållsöversättning
När du har konfigurerat din Next.js-applikation för i18n måste du implementera strategier för att översätta ditt innehåll. Här är flera populära tillvägagångssätt:
1. Använda ett dedikerat översättningshanteringssystem (TMS)
För storskaliga projekt med många språk rekommenderas ett TMS starkt. Populära alternativ inkluderar:
- Phrase: Ett molnbaserat TMS med integrationer för olika plattformar, inklusive Next.js. Erbjuder samarbetsfunktioner och automatiserade arbetsflöden.
- Localize: Ett annat molnbaserat TMS som stöder ett brett utbud av filformat och tillhandahåller funktioner för översättningshantering.
- Crowdin: Ett kraftfullt TMS som är mycket populärt i open source-communityn och integreras väl med Next.js, vilket gör att team effektivt kan översätta innehåll.
Fördelar:
- Centraliserad översättningshantering.
- Samarbetsfunktioner för översättare.
- Automatisering av översättningsarbetsflöden.
- Integration med ditt utvecklingsarbetsflöde.
2. Skapa JSON-översättningsfiler
För mindre projekt är det en enkel och effektiv metod att använda JSON-filer för att lagra översättningar.
Exempel på katalogstruktur:
/src
├── locales
│ ├── en.json
│ └── es.json
├── components
│ └── MyComponent.js
└── pages
└── index.js
Exempel en.json
:
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Exempel es.json
:
{
"greeting": "¡Hola, mundo!",
"welcomeMessage": "Bienvenido a nuestro sitio web."
}
Exempel 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;
Detta tillvägagångssätt ger flexibilitet och är enkelt för mindre projekt. Det är i allmänhet lätt att uppdatera och underhålla.
3. Använda ett översättningsbibliotek
Flera JavaScript-bibliotek effektiviserar innehållsöversättning inom dina React-komponenter.
next-i18next
: Ett populärt bibliotek specifikt utformat för Next.js. Det integreras väl med ramverket och erbjuder funktioner som server-side rendering (SSR) och klient-sidig översättning.react-i18next
: Ett allmänt i18n-bibliotek för React. Du kan använda det i dina Next.js-applikationer, även om det kan kräva mer konfiguration jämfört mednext-i18next
.
Exempel med next-i18next
(Installation: npm install next-i18next i18next react-i18next
):
Skapa en i18n-konfigurationsfil (t.ex. i18n.js
i din rotkatalog):
// 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 }
Skapa din Next.js-konfiguration för 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'],
},
// annan konfiguration
}
module.exports = nextConfig
Lägg till konfigurationen och översättningsimporten i din _app.js
:
import { appWithTranslation } from 'next-i18next';
import '../styles/globals.css';
function MyApp({ Component, pageProps }) {
return ;
}
export default appWithTranslation(MyApp);
Skapa en mapp och fyll den med locales för dina översättningar.
/public
└── locales
├── en
│ └── common.json
├── es
│ └── common.json
└── fr
└── common.json
Exempel en/common.json:
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Använda översättningen i en komponent:
import { useTranslation } from 'next-i18next';
function MyComponent() {
const { t } = useTranslation('common');
return (
{t('greeting')}
{t('welcomeMessage')}
);
}
export default MyComponent;
Detta exempel använder useTranslation
-hooken för att hämta översättningar baserat på den aktuella locale.
Hantera dynamiska routes och Static Site Generation (SSG)
Internationalisering blir mer komplex när man hanterar dynamiska routes (t.ex. blogginlägg, produktsidor) och static site generation (SSG).
1. Dynamiska routes (t.ex. /blog/[slug])
För dynamiska routes måste du generera de korrekta sökvägarna för varje locale vid byggtid med hjälp av getStaticPaths
. Denna funktion returnerar en array av sökvägar som Next.js ska för-rendera.
export async function getStaticPaths() {
const paths = [];
const locales = ['en', 'es', 'fr'];
const posts = await fetchPosts(); // Hämta data för blogginlägg
posts.forEach(post => {
locales.forEach(locale => {
paths.push({
params: {
slug: post.slug,
},
locale,
});
});
});
return {
paths,
fallback: false, // eller 'blocking' om du vill visa ett laddningstillstånd
};
}
export async function getStaticProps({ params, locale }) {
const post = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Förklaring:
getStaticPaths
: Denna funktion itererar genom dina blogginlägg och genererar en sökväg för varje inlägg och varje locale.params
-objektet innehåller route-parametrarna (t.ex. sluggen för blogginlägget).locale
: Denna parameter anger den aktuella locale, vilket gör att du kan hämta det översatta innehållet för den specifika locale.fallback
: Bestämmer hur Next.js hanterar sökvägar som inte definieras igetStaticPaths
.fallback: false
genererar 404-sidor för odefinierade sökvägar.fallback: 'blocking'
för-renderar sidor vid behov.
2. Static Site Generation (SSG) med getStaticProps
I getStaticProps
kan du hämta översatt innehåll baserat på locale
-parametern.
export async function getStaticProps({ params, locale }) {
// Hämta innehåll baserat på locale och params
const { post } = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Funktionen getPostBySlug
bör hämta det översatta innehållet för den givna sluggen och locale, vilket kan hämtas från dina översättningsfiler, databas eller ett CMS.
3. Server-Side Rendering (SSR) med getServerSideProps
För innehåll som behöver hämtas vid förfrågningstillfället, använd getServerSideProps
. Detta är användbart om innehållet ändras ofta eller är personanpassat för varje användare.
export async function getServerSideProps({ params, locale, req, res }) {
// Hämta data baserat på locale och params (t.ex. från en databas)
const data = await fetchData(params.slug, locale);
return {
props: {
data,
},
};
}
Bästa praxis för Next.js-internationalisering
Att följa dessa bästa praxis hjälper dig att bygga robusta, underhållbara och användarvänliga flerspråkiga applikationer:
- Planera tidigt: Tänk på internationalisering från början av ditt projekt. Det är mycket lättare att implementera det från start än att eftermontera det senare.
- Separera innehåll från kod: Lagra all översättningsbar text i separata filer (t.ex. JSON-filer eller ett TMS) och undvik att hårdkoda text direkt i dina komponenter.
- Använd ett översättningshanteringssystem (TMS): För större projekt kan ett TMS effektivisera översättningsprocessen och förbättra samarbetet.
- Testa noggrant: Testa din applikation på alla språk som stöds för att säkerställa korrekta översättningar, korrekt formatering och korrekt rendering över olika webbläsare och enheter. Testa på riktiga enheter, inte bara emulatorer.
- Tänk på höger-till-vänster-språk (RTL): Om du stöder språk som arabiska или hebreiska, se till att din design och layout hanterar textriktning från höger till vänster. Next.js hanterar inte detta automatiskt, så CSS eller andra lösningar krävs.
- Hantera datum- och tidsformatering: Använd bibliotek eller inbyggda funktioner för att formatera datum och tider enligt användarens locale. Moment.js och date-fns är två populära och hjälpsamma bibliotek.
- Hantera nummer- och valutformatering: Formatera nummer och valutasymboler korrekt baserat på användarens locale.
- Optimera SEO: Använd språkspecifika metataggar (
hreflang
) för att hjälpa sökmotorer att indexera ditt innehåll korrekt. Inkludera språkkoder i dina URL:er. - Prioritera användarupplevelsen: Tillhandahåll ett tydligt och intuitivt sätt för användare att växla mellan språk. Överväg att erbjuda automatisk språkdetektering baserat på webbläsarinställningar.
- Håll dig uppdaterad: Håll din Next.js-version och dina i18n-bibliotek uppdaterade för att dra nytta av de senaste funktionerna och säkerhetspatcharna.
- Tänk på tillgänglighet (a11y): Se till att ditt översatta innehåll är tillgängligt för användare med funktionsnedsättningar. Ange alternativ text för bilder och använd lämpliga ARIA-attribut. Använd skärmläsare för att testa.
SEO-överväganden för internationaliserade webbplatser
Att optimera din internationaliserade webbplats för sökmotorer är avgörande för att driva organisk trafik från hela världen. Här är några viktiga SEO-metoder:
hreflang
-taggar: Implementerahreflang
-taggar i<head>
-sektionen av din HTML för att berätta för sökmotorer om språk- och regionala variationer av ditt innehåll. Detta är kritiskt för SEO. Till exempel:<link rel="alternate" hreflang="en" href="https://example.com/en/" />
och<link rel="alternate" hreflang="es" href="https://example.com/es/" />
- Språkspecifika URL:er: Använd språkkoder i dina URL:er (t.ex.
/en/about
,/es/acerca-de
). Detta indikerar tydligt innehållets språk för både användare och sökmotorer. - Lokaliserat innehåll: Översätt ditt innehåll korrekt och naturligt. Maskinöversättningar bör granskas av en modersmålstalare.
- Lokaliserade metabeskrivningar och titlar: Skriv unika och övertygande metabeskrivningar och titlar för varje språk för att förbättra klickfrekvensen i sökresultaten.
- XML-webbplatskartor: Skapa och skicka in XML-webbplatskartor som inkluderar alla språkvariationer av dina sidor.
- Intern länkning: Använd lämpliga interna länkar mellan språkversioner av ditt innehåll.
- Landsspecifik sökordsanalys: Genomför sökordsanalys på varje språk för att identifiera de termer som användare söker efter i varje region.
Exempel: Bygga en enkel flerspråkig blogg
Låt oss skapa ett förenklat exempel på en flerspråkig blogg med Next.js. Detta ger en mer konkret illustration av hur man tillämpar de koncept som diskuterats ovan.
1. Projektinställning
Skapa ett nytt Next.js-projekt:
npx create-next-app my-multi-lang-blog
cd my-multi-lang-blog
2. Konfigurera i18n (next.config.js
)
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
i18n: {
locales: ['en', 'es', 'fr'],
defaultLocale: 'en',
},
}
module.exports = nextConfig
3. Skapa översättningsfiler
Skapa en locales
-mapp i rotkatalogen och lägg till följande 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. Skapa blogginläggskomponenten (t.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. Skapa startsidan (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;
Detta förenklade exempel visar de grundläggande principerna för Next.js-internationalisering. Du kan bygga vidare på detta grundläggande ramverk för att inkludera mer komplexa funktioner, såsom dynamiska routes och integration med översättningshanteringssystem. Överväg att förbättra länkarna ovan med Link
-komponenten och lägg till det lämpliga locale
-attributet.
6. Kör applikationen
Kör applikationen med:
npm run dev
Nu kan du komma åt din blogg på http://localhost:3000
(engelska), http://localhost:3000/es
(spanska) och http://localhost:3000/fr
(franska). Du bör se titeln och blogginläggets innehåll översatt baserat på den valda locale.
Slutsats
Next.js tillhandahåller en omfattande uppsättning funktioner för att implementera internationalisering i dina webbapplikationer. Genom att följa principerna och teknikerna som beskrivs i denna guide kan du skapa flerspråkiga applikationer som levererar lokaliserade upplevelser till användare över hela världen. Kom ihåg att planera din i18n-strategi tidigt, välja rätt översättningsmetod för dina behov och prioritera användarupplevelsen. Med noggrann planering och genomförande kan du bygga applikationer som tilltalar en global publik och öppnar nya möjligheter för tillväxt. Kontinuerligt lärande och att hålla sig uppdaterad med de senaste versionerna och bästa praxis kommer att säkerställa att du använder dina verktyg och tekniker effektivt.
I takt med att tekniken utvecklas kan vi förvänta oss att se mer avancerade i18n-funktioner dyka upp. Förmågan att nå användare över olika kulturer och språkgrupper kommer att förbli en nyckelprioritet för applikationsutvecklare världen över. Därför är att bemästra grunderna i i18n en värdefull färdighet som kommer att öka ditt värde i dagens globala utvecklingslandskap.