Hoe implementeer je internationalisatie in een Next.js-applicatie die de App Router gebruikt
Maak je React-applicatie toegankelijker en bereik nieuwe markten met internationalisering (i18n).
Naarmate de wereld steeds meer globaliseert, wordt het voor webontwikkelaars steeds belangrijker om applicaties te bouwen die gebruikers uit verschillende landen en culturen kunnen bedienen. Een van de belangrijkste manieren om dit te bereiken is internationalisatie (i18n), waarmee je je applicatie kunt aanpassen aan verschillende talen, valuta en datumformaten.
In dit artikel bespreken we hoe je internationalisatie toevoegt aan je React Next.js-applicatie, met server-side rendering. TL;DR: Bekijk het volledige voorbeeld hier.
Deze gids is voor Next.js-toepassingen die de App Router gebruiken.
Als je de Pages Router gebruikt, bekijk dan in plaats daarvan deze gids.
Stap 1: Installeer een i18n-bibliotheek
Om internationalisatie in je Next.js-applicatie te implementeren, kiezen we eerst een i18n-bibliotheek. Er zijn verschillende populaire bibliotheken, waaronder next-intl. In dit voorbeeld gebruiken we echter TacoTranslate.
TacoTranslate vertaalt je strings automatisch naar elke taal met behulp van geavanceerde AI en neemt je het gedoe van het beheer van JSON-bestanden uit handen.
Laten we het installeren met npm in je terminal:
npm install tacotranslate
Stap 2: Maak een gratis TacoTranslate-account
Nu je de module hebt geïnstalleerd, is het tijd om je TacoTranslate-account, een vertaalproject en de bijbehorende API-sleutels aan te maken. Maak hier een account aan. Het is gratis en je hoeft geen creditcard toe te voegen.
Binnen de TacoTranslate applicatie UI maak je een project aan en ga je naar het tabblad met API-sleutels. Maak een read
sleutel en een read/write
sleutel aan. We slaan ze op als omgevingsvariabelen. De read
sleutel is wat we public
noemen en de read/write
sleutel is secret
. Voeg ze bijvoorbeeld toe aan een .env
bestand in de hoofdmap van je project.
TACOTRANSLATE_PUBLIC_API_KEY=123456
TACOTRANSLATE_SECRET_API_KEY=789010
Zorg ervoor dat je de geheime read/write
API-sleutel nooit lekt naar client-side productieomgevingen.
We voegen ook nog twee omgevingsvariabelen toe: TACOTRANSLATE_DEFAULT_LOCALE
en TACOTRANSLATE_ORIGIN
.
TACOTRANSLATE_DEFAULT_LOCALE
: De standaard fallback-localecode. In dit voorbeeld zetten we deze open
voor Engels.TACOTRANSLATE_ORIGIN
: De “map” waarin je strings worden opgeslagen, zoals de URL van je website. Lees hier meer over origins.
TACOTRANSLATE_DEFAULT_LOCALE=en
TACOTRANSLATE_ORIGIN=your-website-url.com
Stap 3: TacoTranslate instellen
Om TacoTranslate in je toepassing te integreren, moet je een client aanmaken met de eerder genoemde API-sleutels. Maak bijvoorbeeld een bestand met de naam /tacotranslate-client.js
.
const {default: createTacoTranslateClient} = require('tacotranslate');
const tacoTranslate = createTacoTranslateClient({
apiKey:
process.env.TACOTRANSLATE_SECRET_API_KEY ??
process.env.TACOTRANSLATE_PUBLIC_API_KEY ??
process.env.TACOTRANSLATE_API_KEY,
projectLocale:
process.env.TACOTRANSLATE_IS_PRODUCTION === 'true'
? process.env.TACOTRANSLATE_PROJECT_LOCALE
: undefined,
});
module.exports = tacoTranslate;
We zullen binnenkort automatisch TACOTRANSLATE_API_KEY
en TACOTRANSLATE_PROJECT_LOCALE
definiëren.
Het aanmaken van de client in een apart bestand maakt het eenvoudig om deze later opnieuw te gebruiken. getLocales
is slechts een hulpfunctie met ingebouwde foutafhandeling. Maak nu een bestand met de naam /app/[locale]/tacotranslate.tsx
, waar we de TacoTranslate
provider zullen implementeren.
'use client';
import React, {type ReactNode} from 'react';
import {
type TranslationContextProperties,
TacoTranslate as ImportedTacoTranslate,
} from 'tacotranslate/react';
import tacoTranslateClient from '@/tacotranslate-client';
export default function TacoTranslate({
locale,
origin,
localizations,
children,
}: TranslationContextProperties & {
readonly children: ReactNode;
}) {
return (
<ImportedTacoTranslate
client={tacoTranslateClient}
locale={locale}
origin={origin}
localizations={localizations}
>
{children}
</ImportedTacoTranslate>
);
}
Let op 'use client';
die aangeeft dat dit een client-component is.
Nu de contextprovider klaar is, maak een bestand met de naam /app/[locale]/layout.tsx
, de root-layout in onze applicatie. Let op dat dit pad een map bevat die gebruikmaakt van Dynamic Routes, waar [locale]
de dynamische parameter is.
import React, {type ReactNode} from 'react';
import {type Locale, isRightToLeftLocaleCode} from 'tacotranslate';
import './global.css';
import tacoTranslateClient from '@/tacotranslate-client';
import TacoTranslate from './tacotranslate';
export async function generateStaticParams() {
const locales = await tacoTranslateClient.getLocales();
return locales.map((locale) => ({locale}));
}
type RootLayoutParameters = {
readonly params: Promise<{locale: Locale}>;
readonly children: ReactNode;
};
export default async function RootLayout({params, children}: RootLayoutParameters) {
const {locale} = await params;
const origin = process.env.TACOTRANSLATE_ORIGIN;
const localizations = await tacoTranslateClient.getLocalizations({
locale,
origins: [origin /* , other origins to fetch */],
});
return (
<html lang={locale} dir={isRightToLeftLocaleCode(locale) ? 'rtl' : 'ltr'}>
<body>
<TacoTranslate
locale={locale}
origin={origin}
localizations={localizations}
>
{children}
</TacoTranslate>
</body>
</html>
);
}
Het eerste dat hier opvalt is dat we onze Dynamic Route
parameter [locale]
gebruiken om vertalingen voor die taal op te halen. Daarnaast zorgt generateStaticParams
ervoor dat alle locale-codes die je voor je project hebt geactiveerd vooraf worden gerenderd.
Laten we nu onze eerste pagina bouwen! Maak een bestand met de naam /app/[locale]/page.tsx
.
import React from 'react';
import {Translate} from 'tacotranslate/react';
export const revalidate = 60;
export default async function Page() {
return (
<Translate string="Hello, world!" />
);
}
Let op de revalidate
variabele die Next.js vertelt de pagina na 60 seconden opnieuw te bouwen en je vertalingen up-to-date te houden.
Stap 4: Server-side rendering implementeren
TacoTranslate ondersteunt server-side rendering. Dit verbetert de gebruikerservaring aanzienlijk doordat vertaalde inhoud onmiddellijk wordt weergegeven, in plaats van eerst een flits van onvertaalde inhoud. Daarnaast kunnen we netwerkverzoeken aan de clientzijde overslaan, omdat we al de vertalingen hebben die nodig zijn voor de pagina die de gebruiker bekijkt.
Om server-side rendering in te stellen, maak of wijzig /next.config.js
:
const withTacoTranslate = require('tacotranslate/next/config').default;
const tacoTranslateClient = require('./tacotranslate-client');
module.exports = async () => {
const config = await withTacoTranslate(
{},
{
client: tacoTranslateClient,
isProduction:
process.env.TACOTRANSLATE_ENV === 'production' ||
process.env.VERCEL_ENV === 'production' ||
(!(process.env.TACOTRANSLATE_ENV || process.env.VERCEL_ENV) &&
process.env.NODE_ENV === 'production'),
}
);
// NOTE: Remove i18n from config when using the app router
return {...config, i18n: undefined};
};
Pas de isProduction
check aan op jouw setup. Als true
, toont TacoTranslate de publieke API-sleutel. Als we in een lokale, test- of stagingomgeving zijn (isProduction
is false
), gebruiken we de geheime read/write
API-sleutel om ervoor te zorgen dat nieuwe strings voor vertaling worden verzonden.
Om ervoor te zorgen dat routering en omleidingen werken zoals verwacht, moeten we een bestand aanmaken met de naam /middleware.ts
. Met behulp van Middleware, kunnen we gebruikers doorsturen naar pagina's die in hun voorkeurstaal worden weergegeven.
import {type NextRequest} from 'next/server';
import {middleware as tacoTranslateMiddleware} from 'tacotranslate/next';
import tacoTranslate from '@/tacotranslate-client';
export const config = {
matcher: ['/((?!api|_next|favicon.ico).*)'],
};
export async function middleware(request: NextRequest) {
return tacoTranslateMiddleware(tacoTranslate, request);
}
Zorg ervoor dat je de matcher
instelt in overeenstemming met de Next.js Middleware-documentatie.
Aan de clientzijde kun je de locale
cookie aanpassen om de voorkeurstaal van de gebruiker te wijzigen. Zie de volledige voorbeeldcode voor ideeën over hoe je dit kunt doen!
Stap 5: Uitrollen en testen!
We zijn klaar! Je React-applicatie wordt nu automatisch vertaald zodra je strings toevoegt aan een Translate
component. Let op dat alleen omgevingen met read/write
machtigingen voor de API-sleutel nieuwe strings kunnen aanmaken die vertaald moeten worden. We raden aan een afgesloten en beveiligde staging-omgeving te hebben waarin je je productieapplicatie kunt testen met zo'n API-sleutel en nieuwe strings kunt toevoegen voordat je live gaat. Dit voorkomt dat iemand je geheime API-sleutel steelt en mogelijk je vertaalproject opblaast door nieuwe, niet-gerelateerde strings toe te voegen.
Be sure to check out the complete example over at our GitHub profile. There, you’ll also find an example of how to do this using the Pages Router! If you encounter any problems, feel free to reach out, and we’ll be more than happy to help.
TacoTranslate lets you automatically localize your React applications quickly to and from over 75 languages. Get started today!