Как да внедрим интернационализация в Next.js приложение, използващо App Router
Направете вашето React приложение по-достъпно и достигнете до нови пазари с интернационализация (i18n).
С нарастващата глобализация на света, става все по-важно за уеб разработчиците да създават приложения, които да отговарят на нуждите на потребители от различни страни и култури. Един от ключовите начини да се постигне това е чрез интернационализация (i18n), която ви позволява да адаптирате вашето приложение към различни езици, валути и формати на датите.
В тази статия ще разгледаме как да добавите интернационализация към вашето React Next.js приложение със server side rendering. TL;DR: Вижте пълния пример тук.
Това ръководство е за Next.js приложения, които използват App Router.
Ако използвате Pages Router, вижте това ръководство вместо това.
Стъпка 1: Инсталиране на i18n библиотека
За да внедрите интернационализация във вашето Next.js приложение, първо ще изберем i18n библиотека. Има няколко популярни библиотеки, включително next-intl. В този пример обаче ще използваме TacoTranslate.
TacoTranslate автоматично превежда вашите низове на всеки език с помощта на най-съвременен ИИ и ви освобождава от досадното управление на JSON файлове.
Нека го инсталираме с помощта на npm в терминала ви:
npm install tacotranslate
Стъпка 2: Създайте безплатен акаунт в TacoTranslate
Сега, когато сте инсталирали модула, е време да създадете вашия TacoTranslate акаунт, проект за превод и свързаните с него API ключове. Създайте акаунт тук. Това е безплатно и не изисква добавяне на кредитна карта.
В интерфейса на приложението TacoTranslate създайте проект и отворете таба с API ключове. Създайте един read
ключ и един read/write
ключ. Ще ги запазим като променливи на средата. read
ключът е това, което наричаме public
, а read/write
ключът е secret
. Например, можете да ги добавите във файл .env
в корена на вашия проект.
TACOTRANSLATE_PUBLIC_API_KEY=123456
TACOTRANSLATE_SECRET_API_KEY=789010
Уверете се, че никога не излагате тайната read/write
API ключ към клиентската страна в продукционни среди.
Ще добавим и още две променливи на средата: TACOTRANSLATE_DEFAULT_LOCALE
и TACOTRANSLATE_ORIGIN
.
TACOTRANSLATE_DEFAULT_LOCALE
: Кодът на подразбиращия се език за връщане. В този пример ще го зададем наen
за английски.TACOTRANSLATE_ORIGIN
: „Папката“, където ще се съхраняват вашите стрингове, например URL адресът на вашия уебсайт. Прочетете повече за origins тук.
TACOTRANSLATE_DEFAULT_LOCALE=en
TACOTRANSLATE_ORIGIN=your-website-url.com
Стъпка 3: Настройване на TacoTranslate
За да интегрирате TacoTranslate с вашето приложение, ще трябва да създадете клиент, използвайки API ключовете от по-рано. Например, създайте файл с име /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;
Ще дефинираме автоматично TACOTRANSLATE_API_KEY
и TACOTRANSLATE_PROJECT_LOCALE
съвсем скоро.
Създаването на клиента в отделен файл прави лесно повторното му използване по-късно. getLocales
е просто помощна функция с вградена обработка на грешки. Сега създайте файл на име /app/[locale]/tacotranslate.tsx
, където ще имплементираме доставчика на TacoTranslate
.
'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>
);
}
Обърнете внимание на 'use client';
, което показва, че това е клиентски компонент.
Сега, когато доставчикът на контекст е готов, създайте файл с име /app/[locale]/layout.tsx
, основният layout в нашето приложение. Обърнете внимание, че този път съдържа папка, използваща Dynamic Routes, където [locale]
е динамичният параметър.
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>
);
}
Първото нещо, което трябва да се отбележи тук, е, че използваме нашия Dynamic Route
параметър [locale]
за извличане на преводи за този език. Освен това, generateStaticParams
гарантира, че всички езикови кодове, които сте активирали за вашия проект, се предварително рендерират.
Сега нека създадем нашата първа страница! Създайте файл с името /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!" />
);
}
Обърнете внимание на променливата revalidate
, която инструктира Next.js да препострои страницата след 60 секунди и да поддържа вашите преводи актуални.
Стъпка 4: Имплементиране на рендериране от страна на сървъра
TacoTranslate поддържа рендиране от страна на сървъра. Това значително подобрява потребителското изживяване, като показва преведено съдържание веднага, вместо първо силует на непреведено съдържание. Освен това можем да пропуснем мрежовите заявки на клиента, защото вече разполагаме с необходимите преводи за страницата, която потребителят разглежда.
За да настроите рендиране от страна на сървъра, създайте или модифицирайте /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};
};
Променете проверката на isProduction
, за да отговаря на вашата настройка. Ако true
, TacoTranslate ще покаже публичния API ключ. Ако сме в локална, тестова или етапна среда (isProduction
is false
), ще използваме ключа за тайни read/write
API, за да се уверим, че новите низове се изпращат за превод.
За да осигурим, че маршрутизирането и пренасочването работят както трябва, ще трябва да създадем файл на име /middleware.ts
. Използвайки Middleware, можем да пренасочваме потребителите към страници, представени на предпочитания от тях език.
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);
}
Уверете се, че сте настроили matcher
в съответствие с документацията за Middleware на Next.js.
На клиента, можете да променяте бисквитката locale
, за да смените предпочитания от потребителя език. Моля, вижте пълния примерен код за идеи как да го направите!
Стъпка 5: Разгръщане и тестване!
Готови сме! Вашето React приложение сега ще се превежда автоматично, когато добавите някакви низове в компонент Translate
. Обърнете внимание, че само среди с разрешения read/write
за API ключа ще могат да създават нови низове за превод. Препоръчваме да имате затворена и защитена стейджинг среда, където можете да тествате вашето продукционно приложение с такъв API ключ, като добавяте нови низове преди да го пуснете на живо. Това ще предотврати някой да открадне вашия таен API ключ и потенциално да натовари вашия преводачески проект с нови, нерелевантни низове.
Не забравяйте да прегледате пълния пример в нашия профил в GitHub. Там ще намерите и пример за това как да го направите с помощта на Pages Router ! Ако срещнете някакви проблеми, не се колебайте да се свържете с нас, и ще се радваме да помогнем.
TacoTranslate ви позволява бързо да локализирате вашите React приложения автоматично на и от всякакъв език. Започнете днес!